gpt4 book ai didi

c# - 有没有一种简单的方法可以使 Visual Studio 2015 使用特定的 ToolsVersion?

转载 作者:IT王子 更新时间:2023-10-29 03:52:02 26 4
gpt4 key购买 nike

当使用特定版本的 msbuild 构建项目或解决方案时,我可以使用 /toolsversion/tv 开关:

"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 ...
...

如果我指定/tv,那么根据我使用的 msbuild 版本和一些环境变量,我可能会得到:

  • 在项目文件的顶级元素中指定的 ToolsVersion
  • 我正在使用的 msbuild.exe 版本对应的 ToolsVersion
  • 来自 msbuild.exe.config 的值
  • 来自注册表的值

(参见 different versions of the Overriding ToolsVersion Settings page on MSDN)。

因此,为了在构建服务器和我的本地计算机上获得一致的结果,我在运行 msbuild.exe 时使用了 /tv(实际上,这是在 psake 脚本中强制执行的,这也确保它使用相应版本的 msbuild.exe)。

但是 在使用 Visual Studio 构建时,我无法使用 /tv 开关。相反,Visual Studio 2013 及更高版本将使用该版本的 Visual Studio 附带的 .net 工具链除非:

  • 环境变量 MSBUILDLEGACYDEFAULTTOOLSVERSION 已设置并且...
  • ...所有项目文件的 ToolsVersion 属性都设置为我要使用的版本。

这太巴洛克了,我不敢相信有人真的在这么做。因此,我的问题是:

  • 是否有人在做 MSBUILDLEGACYDEFAULTTOOLSVERSION 事情?
  • 如果不是,除了使用随该 ToolsVersion 附带的 Visual Studio 版本之外,还有其他方法可以让 Visual Studio 使用特定的 ToolsVersion 吗?可以存储在版本控制中(例如在项目或其他设置文件中)的东西是理想的。

最后:

  • 我应该关心吗?鉴于 C# 编译器的每个后续版本都应该能够处理以前版本的输入,并且我可以在项目文件中设置目标 .net 框架和 C# 语言级别,这是否足以确保可重复构建?

(我的偏见是我应该关心,因为:

  • 我希望 IDE 中的构建和构建服务器上的构建相同(当然)
  • 我希望能够使用 VS2015(和 future 版本),因为它是比以前版本更好的 IDE,但我不想被迫使用新工具链,直到我决定使用。

也许是我想要的太多...)

问题的具体例子,请看我的msbuild-vs-vs2015-toolsversion github 上的存储库。


一些背景:我问这个是因为我们最近遇到了一个 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 中使用该扩展。

关于c# - 有没有一种简单的方法可以使 Visual Studio 2015 使用特定的 ToolsVersion?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34065614/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com