Guy*_*ing 47 .net c# msbuild visual-studio-2015
使用特定版本的msbuildI 构建项目或解决方案时,可以使用/toolsversion或/tv切换选择较早的.net工具链:
"C:\Program Files (x86)\MSBuild\14.0\bin\msbuild" /tv:12.0 amazing.sln
Run Code Online (Sandbox Code Playgroud)
根据以上内容正确选择适用于所有版本的Just Works msbuild和版本csc.exe等:
> "C:\Program Files (x86)\MSBuild\14.0\bin\msbuild" /tv:4.0 amazing.sln
...
CoreCompile:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe ...
...
> "C:\Program Files (x86)\MSBuild\14.0\bin\msbuild" /tv:12.0 amazing.sln
...
CoreCompile:
C:\Program Files (x86)\MSBuild\12.0\bin\Csc.exe ...
...
Run Code Online (Sandbox Code Playgroud)
如果我没有指定/tv,那么根据我正在使用的msbuild的版本和一些环境变量,我可能得到以下任何一个:
msbuild.exe我正在使用的版本msbuild.exe.config(请参阅 MSDN上的Overriding ToolsVersion Settings页面的不同版本).
因此,为了在构建服务器和本地机器上具有一致结果的构建,我/tv在运行时使用msbuild.exe(事实上,这是在psake脚本中强制执行的,这也确保它使用相应的版本msbuild.exe).
但是,/tv在使用Visual Studio构建时,我无法使用该开关.相反,Visual Studio 2013及更高版本将使用该版本的Visual Studio附带的.net工具链,除非:
MSBUILDLEGACYDEFAULTTOOLSVERSION已设置并且 ......这是如此巴洛克式,我无法相信任何人实际上是这样做的.我的问题是这样的:
MSBUILDLEGACYDEFAULTTOOLSVERSION的事情吗?最后:
(我的偏见是我应该关心,因为:
也许我想要太多......)
有关此问题的具体示例,请参阅github上的msbuild-vs-vs2015-toolsversion存储库.
一些背景:我问这个是因为我们最近有一个CI构建错误,当我的一个同事提交了C#6.0代码,这些代码在他们的Visual Studio 2015副本上与Roslyn编译良好,但在CI中失败,因为它使用了之前的版本.net工具链(他们使用了没有setter的自动属性,这在Roslyn中很好,但在早期版本中没有).我们将更新CI构建到Roslyn,但我想看看我们是否可以阻止将来发生这种事情.
我通过编写Visual Studio扩展来解决这个问题,该扩展MSBUILDDEFAULTTOOLSVERSION在构建期间临时设置环境变量; 要使用的值是从与文件.toolsversion相同的目录中的.sln文件中读取的.psake脚本读取相同的.toolsversion文件并将值传递给/tv交换机.
可以在此处找到扩展的代码:https://github.com/guyboltonking/set-toolsversion-extension.可悲的是,我目前没有使用C++,或者确实使用Visual Studio,所以我无法为它提供任何支持(但我可以告诉你,我几个月没有任何问题地使用它).
感谢@efaruk提醒我存在的问题MSBUILDDEFAULTTOOLSVERSION.
编辑:感谢@ mbadawi23,现在可以使用VS2015和VS2017的扩展.
| 归档时间: |
|
| 查看次数: |
17483 次 |
| 最近记录: |