如何在 Ubuntu 特工上杀死 VBCSCompiler.exe?

How to kill VBCSCompiler.exe on Ubuntu agent?

我创建了一个 Azure Devops 构建管道,我正在尝试在 bitbucket (git) 上构建我的 ASP.NET MVC 和 Angular 混合站点项目。

首先签出项目,然后 nuget 恢复必要的包,然后构建 .NET。我使用 windows 2019 作为 azure 管道代理,以便构建成功。然而,它大约需要 7 分钟才能完成,而 运行 在 ubuntu 代理上执行任务(除了 .Net)要快得多!大约需要 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]

根据 this postVBCSCompiler.exe 从 Compiler Nuget 包(nuget 恢复任务?)继续 运行,因此它锁定了 src 文件夹并阻止了来自 [=43 的未来构建=]宁,例如导致这样的错误:

/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 但由于在构建期间我无法实际访问托管机器,我不确定该怎么做。

到目前为止我的管道截图:

使用这种方法,我是否面临 dead-end 路径?构建 运行 在 windows 2019 上很好,但它花费的时间太长了,所以这就是为什么如果我能在 ubuntu 上成功地 运行 那会很棒!

您可以尝试以下解决方法:

1,设置MSBUILD参数/p:UseSharedCompilation=false.

您可以将上述论点添加到 msbuild 任务的 msbuild arguments 字段中。参见 here

2,将Microsoft.CodeDom.Providers.DotNetCompilerPlatform nupkg 升级到最新版本并从您的项目中删除Microsoft.Net.Compilers nupkg。有关详细信息,请参阅 here

3、尝试指定 Roslyn 编译服务器的 TTL。

您可以在“变量”选项卡上定义管道变量 VBCSCOMPILER_TTL,以便为 VBCSCompiler.exe

指定更短的空闲时间

或者你可以在配置文件的system.codedom/compilers/compiler下添加<providerOption name="CompilerServerTimeToLive" value="[num of seconds]" />。有关详细信息,请参阅 here

4、使用CheckIfShouldKillVBCSCompiler目标:

您可以尝试将以下内容添加到您的 csproj 文件中:

<Target Name="CheckIfShouldKillVBCSCompiler">
  <PropertyGroup>
    <ShouldKillVBCSCompiler>true</ShouldKillVBCSCompiler>
  </PropertyGroup>
</Target>

here

基于 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'))" />

为了给答案提供一些上下文,此 post here 表示从 MSBuild 集成包还原转换为自动包还原(nuget 还原任务)意味着 Microsoft.Net.Compilers <Import><Error Condition> 片段不再 relevant/needed 在 .csproj 文件中。