Я создал конвейер Azure Devops Build и пытаюсь создать проект гибридного сайта ASP.NET MVC и Angular на битбакете (git).
Сначала проект проверяется, и nuget восстанавливает необходимые пакеты, а затем выполняется сборка .NET. Я использовал Windows 2019 в качестве агента лазурного конвейера для успешной сборки. однако это занимает около 7 минут, в то время как выполнение задач (помимо .Net) на агенте ubuntu происходит намного быстрее! вместо этого занимает около 2 минут!
Поэтому я хотел бы использовать ubuntu, но у меня возникла проблема с задачей MSBuild...
"/home/vsts/work/1/s/Bobby.ProjectA/Bobby.ProjectA.csproj" (default target) (1) ->
(KillVBCSCompilerAndRetryCopy target) ->
/home/vsts/work/1/s/packages/Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.8/build/net45/Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props(23,5):
error MSB4044: The "KillProcess" task was not given a value for the required parameter "ImagePath". [/home/vsts/work/1/s/Bobby.ProjectA/Bobby.ProjectA.csproj]
Согласно этому сообщению, VBCSCompiler.exe
продолжает работать из пакета Compiler Nuget (задача восстановления nuget?), поэтому он блокирует папки src и предотвращает запуск будущих сборок, например. вызывает такую ошибку:
/home/vsts/work/1/s/packages/Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.8/build/net45/Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props(17,5):
warning MSB3021: Unable to copy file "/home/vsts/work/1/s/packages/Microsoft.Net.Compilers.2.4.0/build/../tools/csc.exe" to "/bin/roslyn/csc.exe". Access to the path '/bin/roslyn' is denied. [/home/vsts/work/1/s/Bobby.ProjectA/Bobby.ProjectA.csproj]
Таким образом, решением было бы убить VBCSCompiler.exe
, но, поскольку я не могу получить доступ к размещенной машине во время сборки, я не знаю, как это сделать.
скриншот моего конвейера:
С таким подходом я сталкиваюсь с тупиковым путем? Сборка отлично работает на Windows 2019, но это занимает слишком много времени, поэтому, если я смогу успешно запустить ее на Ubuntu, это будет здорово!
@LeviLu-MSFT ни один из вариантов не сработал
Вы можете попробовать следующие обходные пути:
1, Установите аргументы MSBUILD /p:UseSharedCompilation=false
.
Вы можете добавить приведенный выше аргумент в поле аргументов msbuild задачи msbuild. Смотрите здесь.
2. Обновите nupkg Microsoft.CodeDom.Providers.DotNetCompilerPlatform до последней версии и удалите nupkg Microsoft.Net.Compilers из своего проекта. Смотрите здесь для получения дополнительной информации.
3. Попробуйте указать TTL сервера компилятора Roslyn.
Вы можете определить переменную конвейера VBCSCOMPILER_TTL
на вкладке Переменная, чтобы указать более короткое время простоя для VBCSCompiler.exe
Или вы можете добавить <providerOption name = "CompilerServerTimeToLive" value = "[num of seconds]" />
под system.codedom/compilers/compiler
в файле конфигурации. Смотрите здесь для получения дополнительной информации.
4. Используйте цель CheckIfShouldKillVBCSCompiler
:
Вы можете попробовать добавить ниже в свой файл csproj:
<Target Name = "CheckIfShouldKillVBCSCompiler">
<PropertyGroup>
<ShouldKillVBCSCompiler>true</ShouldKillVBCSCompiler>
</PropertyGroup>
</Target>
Смотрите здесь.
Леви, как мне вложить цель (вариант 4) в цель до сборки? пожалуйста, найдите мой пост об этом здесь: stackoverflow.com/questions/65308692/…
@Cataster Вы можете попробовать использовать атрибут BeforeTargets . например. <Target Name = "CheckIfShouldKillVBCSCompiler" BeforeTargets = "BeforeBuild">
. или установить InitialTargets например.<Project InitialTargets = "CheckIfShouldKillVBCSCompiler">
.
Цели BeforeBuild не работали. Я тоже пробовал BeforeTargets = "Build"
и это тоже не сработало. Я также попытался поместить группу свойств в саму цель BeforeBuid, но это тоже не сработало. Я хочу попробовать начальные цели, которые вы предложили, но где я могу это добавить? Существует только 1 элемент проекта, и у него уже есть цель по умолчанию... можно ли его переопределить? или мне просто нужно включить его вместе с ним вот так: <Project ToolsVersion = "15.0" InitialTargets = "CheckIfShouldKillVBCSCompiler" DefaultTargets = "Build" xmlns = "http://schemas.microsoft.com/developer/msbuild/2003">
он не работает в любом случае. у меня есть последний вариант: перезапустить агент сборки перед задачей MSBuild, но не знаю, какую задачу добавить/как перезапустить агент ubuntu в конвейере...
@Cataster Вы не можете перезапустить агент во время выполнения конвейера. Вы можете попробовать добавить задачу bash перед задачей MSbuild, чтобы убить процесс VBCSCompiler.exe. killall VBCSCompiler
. смотрите здесь
я получил эту ошибку: VBCSCompiler: no process found
Я застрял прямо сейчас. Если процесс VBCSCompiler на самом деле не запущен, то почему Access to the path '/bin/roslyn' is denied.
? этот пост здесь звучит так, будто это определенно проблема VBCSCompiler, поэтому я так долго пытался использовать все эти варианты. но если все это время проблема не в том, что доступ запрещен, то в чем может быть проблема? developercommunity.visualstudio.com/content/problem/71302/…
Сборка на Ubuntu 20 наконец-то заработала! Я не знаю, почему удаление этих строк решило проблему VBCSCompiler, но благодаря этому msbuild успешно завершился на агенте Ubunutu 20!!
Удалите следующие строки из файла .csproj
:
<Import Project = "..\packages\Microsoft.Net.Compilers.2.4.0\build\Microsoft.Net.Compilers.props" Condition = "Exists('..\packages\Microsoft.Net.Compilers.2.4.0\build\Microsoft.Net.Compilers.props')" />
<Error Condition = "!Exists('..\packages\Microsoft.Net.Compilers.2.4.0\build\Microsoft.Net.Compilers.props')" Text = "$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Net.Compilers.2.4.0\build\Microsoft.Net.Compilers.props'))" />
<Error Condition = "!Exists('..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.8\build\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props')" Text = "$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.8\build\net45\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props'))" />
Чтобы дать некоторый контекст ответу, в этом сообщении здесь указано, что преобразование из встроенного в MSBuild восстановления пакета в автоматическое восстановление пакета (задача восстановления nuget) подразумевает, что фрагменты Microsoft.Net.Compilers
<Import>
и <Error Condition>
больше не актуальны / не нужны в файле .csproj
.
@LeviLu-MSFT Сборка Ubuntu 20 наконец-то заработала! Пожалуйста, проверьте мой ответ
Привет. У вас была возможность проверить ответ ниже? Как прошло?