首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >有简单的方法让Visual 2015使用特定的ToolsVersion吗?

有简单的方法让Visual 2015使用特定的ToolsVersion吗?
EN

Stack Overflow用户
提问于 2015-12-03 12:04:21
回答 4查看 19.6K关注 0票数 49

当使用特定版本的msbuild构建项目或解决方案时,我可以使用/toolsversion/tv开关来选择早期的/toolsversion工具链:

代码语言:javascript
代码运行次数:0
运行
复制
"C:\Program Files (x86)\MSBuild\14.0\bin\msbuild" /tv:12.0 amazing.sln

这只适用于所有版本的msbuild,而csc.exe等的版本是基于以下内容正确选择的:

代码语言:javascript
代码运行次数:0
运行
复制
> "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版本相对应的msbuild.exe
  • 来自msbuild.exe.config的值
  • 注册表中的值。

(见 page on MSDN)。

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

但是,在使用Visual进行构建时不能使用/tv开关。相反,Visual 2013及以上将使用该版本的Visual附带的.net工具链,除非

  • 环境变量MSBUILDLEGACYDEFAULTTOOLSVERSION被设置并且..。
  • ...all项目文件将ToolsVersion属性设置为我希望使用的版本。

这是如此的巴洛克风格,我不敢相信有人真的在这样做。因此,我的问题是:

  • 有人在做MSBUILDLEGACYDEFAULTTOOLSVERSION的事吗?
  • 如果没有,是否有其他方法使Visual使用特定的ToolsVersion,而不是使用该ToolsVersion附带的Visual版本?可以存储在版本控制中的内容(因此可以存储在项目或其他设置文件中)将是理想的。

最后:

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

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

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

也许我想要太多.)

有关该问题的具体示例,请参阅我在github上的msbuild-vs-vs2015-toolsversion存储库。

一些背景:我这么问是因为最近我的一位同事提交了C# 6.0代码,这些代码在Visual 2015的副本上与.net一起编译,但是在CI中失败了,因为它使用了以前发布的.net工具链(他们使用了一个没有设置器的自动属性,这在罗斯林中很好,但在早期版本中不是这样)。我们将更新CI构建到罗斯林,但我想看看我们是否能够防止这种事情发生在未来。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-08-11 14:00:33

我编写了一个Visual扩展来解决这个问题,它在构建过程中临时设置了环境变量MSBUILDDEFAULTTOOLSVERSION;要使用的值是从与.sln文件相同的目录中的文件.toolsversion中读取的。psake脚本读取相同的.toolsversion文件,并将值传递给/tv开关。

扩展的代码可以在这里找到:https://github.com/guyboltonking/set-toolsversion-extension。遗憾的是,我目前没有使用C++,也没有使用Visual,所以我不能为它提供任何支持(但我可以告诉您,我使用它时几个月没有任何问题)。

称赞@efaruk提醒我MSBUILDDEFAULTTOOLSVERSION的存在。

编辑:由于@mbadawi23,现在可以在VS2015和VS2017中使用扩展。

票数 6
EN

Stack Overflow用户

发布于 2016-01-26 14:09:26

注意:您可以通过使用msbuild文件或自行更改项目来创建msbuild文件,并且可以有条件地决定工具版本(https://msdn.microsoft.com/en-us/library/7z253716.aspx) (.csproj也是一个具有不同扩展的结构化msbuild脚本,它也将与VS兼容)。

问候..。

编辑:

https://msdn.microsoft.com/en-us/library/bb383985.aspx

通过在解决方案中的项目上设置$(ProjectToolsVersion)属性。这使您可以使用与其他项目不同的工具集版本在解决方案中构建项目。

因此,我认为你已经得到了答案;)

票数 2
EN

Stack Overflow用户

发布于 2016-12-09 10:28:58

若要强制Visual 2015中的特定C#版本,您可以进入项目属性-> Build ->高级->语言版本。

如果将其设置为5,编译器将抱怨C# 6的特性有: Feature‘.’在C# 5中不可用。请使用语言版本6或更高版本。

Alternativly ReSharper也有一些这样的工具。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34065614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档