在自包含的构建环境中使用与Roslyn的共享编译?

时间:2016-09-12 20:55:56

标签: roslyn

我们最近将构建系统从VS 2013升级到2015 Update 2,我们的构建时间也大幅增加。我们的构建环境是自包含的,因此我们从包(使用devpath)而不是从已安装的位置运行MSBuild。看一下日志,看起来构建时间的增加几乎都在csc构建任务中。在机器上安装MSBuild没有任何影响,但如果我们从安装的位置而不是我们自包含的位置运行,则构建时间与我们在2013年看到的类似。从安装位置运行时,我们可以看到共享的compliation正在从消息" 使用共享编译与目录中的编译器:C:\ Program Files(x86)\ MSBuild \ 14.0 \ bin "。目前我们的印象是,启用共享编译将有助于我们的构建时间,但我们还没有能够从我们自包含的环境中获得它。设置" UseSharedCompilation" to true没有影响,并且在构建期间不会产生上述消息。

有没有办法在从安装位置以外的路径运行MSBuild时启用与Roslyn的共享编译?

2 个答案:

答案 0 :(得分:3)

您是否尝试完全覆盖“Csc”任务?我使用预处理(即“/pp:out.txt”)开关从命令行评估了一个示例CSharp项目,打开了“out.txt”,发现对“UseSharedCompilation”的唯一引用是一个形状或者与Csc构建任务相关的其他内容。

GitHub.com上的所有文本文件的黑暗搜索显示E!真正好莱坞的UseSharedCompilation故事。以下内容来自NuGet Package'Microsoft.Net.Compilers':

  <!-- The UsingTask, UseSharedCompilation, and ToolPath/Exe variables all interact to 
   choose which compiler path to use and whether or not to use the compiler server.
   If UsingTask and UseSharedCompilation are set then the compiler server next to the
   task will be used (i.e., the one in this package).
   If UseSharedCompilation is false or ToolPath/Exe are set the compiler server will
   not be used and the compiler exe at the ToolPath, if set, will be executed, otherwise
   the executable in the MSBuild install path will be executed. -->

因此,根据上面的Xml Comment,您将不得不使用一些MSBuild技巧来实现具有“UseSharedCompilation”的自包含构建环境。有关上述代码段的全文,请参阅https://raw.githubusercontent.com/dotnet/roslyn/c5b249b16f7d67ee1645a1b75fa3de6f16314672/build/NuGetAdditionalFiles/Microsoft.Net.Compilers.props

答案 1 :(得分:2)

事实证明共享编译不是我们的问题。最终我们需要在csc.exe上运行ngen.exe,它依赖于大多数dll。这预先编译它们,因此每次调用exe都不会发生JIT编译。 Visual Studio在安装时执行此操作,但如果将它们放在另一个目录中,则必须再次执行此操作,因为它按位置查找它们。我们刚刚打开登记窗口以在必要文件上运行ngen时添加了一个步骤,因为它非常快。没有它,csc.exe每次通话大约需要10秒钟。