使用特定版本构建项目或解决方案时msbuild
我可以使用以下命令选择早期的 .net 工具链/toolsversion
or /tv
switch:
"C:\Program Files (x86)\MSBuild\14.0\bin\msbuild" /tv:12.0 amazing.sln
这适用于所有版本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 ...
...
If I don't指定/tv
,然后根据我使用的 msbuild 版本和一些环境变量,我可能会得到以下任何一个:
- 项目文件的顶级元素中指定的 ToolsVersion
- ToolsVersion对应的版本
msbuild.exe
我在用着
- 一个值来自
msbuild.exe.config
- 来自注册表的值
(参见不同版本的覆盖工具版本设置MSDN 页面 https://msdn.microsoft.com/en-us/library/bb383985.aspx).
因此,为了使构建在构建服务器和本地计算机上具有一致的结果,我使用/tv
跑步时msbuild.exe
(事实上,这是在psake
脚本,这也确保它使用相应的版本msbuild.exe
).
However我无法使用/tv
使用 Visual Studio 构建时进行切换。相反,Visual Studio 2013 及更高版本将使用该版本的 Visual Studio 附带的 .net 工具链unless:
- 环境变量
MSBUILDLEGACYDEFAULTTOOLSVERSION
is set and...
- ...所有项目文件都将 ToolsVersion 属性设置为我想要使用的版本。
这太巴洛克了,我不敢相信有人真的在这么做。我的问题是:
-
Is任何人在做
MSBUILDLEGACYDEFAULTTOOLSVERSION
thing?
- 如果没有,是否有另一种方法可以让 Visual Studio 使用特定的 ToolsVersion,而不是使用该 ToolsVersion 附带的 Visual Studio 版本?可以存储在版本控制中(因此在项目或其他一些设置文件中)的东西将是理想的。
最后:
- 我应该关心吗?鉴于 C# 编译器的每个后续版本都应该能够处理以前版本的输入,并且我可以在项目文件中设置目标 .net 框架和 C# 语言级别,这是否足以确保可重复构建?
(我的偏见是我should照顾,因为:
- 我希望 IDE 中的构建和构建服务器上的构建相同(当然)
- 我希望能够使用 VS2015(以及未来的版本),因为它是比以前版本更好的 IDE,但我不想被迫使用新的工具链,直到我决定这样做。
也许是我想要的太多了……)
有关问题的具体示例,请参阅我的msbuild-vs-vs2015-tools版本 https://github.com/guyboltonking/msbuild-vs-vs2015-toolsversiongithub 上的存储库。
一些背景:我问这个问题是因为我们最近遇到了 CI 构建错误,当时我的一位同事提交了 C# 6.0 代码,该代码在他们的 Visual Studio 2015 副本上使用 Roslyn 编译得很好,但在 CI 中失败了,因为that使用以前版本的 .net 工具链(他们使用了没有 setter 的自动属性,这在 Roslyn 中很好,但在早期版本中则不然)。我们将更新 Roslyn 的 CI 版本,但我想看看我们是否可以防止将来发生此类事情。