如何将 msbuild 升级到 C# 6?
Posted
技术标签:
【中文标题】如何将 msbuild 升级到 C# 6?【英文标题】:How to upgrade msbuild to C# 6? 【发布时间】:2015-11-07 13:55:50 【问题描述】:我想在我的项目中使用 C# 6(空传播,其他功能)。
我已经在我的 PC 上安装了 VS 2015,它运行良好,可以构建类似的测试代码
var user = new SingleUserModel(); //all model fields are null
var test = user.User?.Avatar?["blah"];
但是当我将我的项目推送到 repo 并且 CI 开始构建它时,构建失败,因为 ?
不受支持。
我也在 CI 服务器上安装了 VS2015,但看起来它并没有使用它。 我能做什么?
CI - CruiseControl .NET
使用 C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe
构建
【问题讨论】:
对于从下面给出的链接下载 MS Build Tools 2015 的任何人,它们适用于有错误的旧(更新前)版本...我找到了一个链接 here 到 2015 Update 3。 【参考方案1】:请务必致电:
C:\Program Files (x86)\MSBuild\14.0\Bin\MsBuild.exe
这是 Visual Studio 2015 附带的 MsBuild 版本,它调用理解这一点的 C# 编译器。您可以通过安装任何版本的 Visual Studio 2015 或安装独立的 Microsoft Build Tools 2015 在您的系统上获取此版本的 MsBuild。
添加对following NuGet package 的引用也将强制使用新编译器:
Install-Package Microsoft.Net.Compilers
请注意Install-Package
将选择最新的可用版本,它可能不是您正在寻找的版本。在安装之前,请检查发行说明和依赖项以解决正在处理的版本的潜在问题,在这种情况下,它更特定于 VS 2015。
所以对于 Visual Studio 2015:
Install-Package Microsoft.Net.Compilers -Version 1.0.0
【讨论】:
自 RyuJIT 或其他有这么多错误的东西以来,是否有任何担心这会导致错误? 请注意,如果您要更新 PATH 环境变量,请务必删除旧位置(例如:C:\Windows\Microsoft.NET\Framework\v4.0.30319),因为它从 cmd 执行“msbuild”时可能仍会调用它 我还必须安装 nuget 包 Microsoft.Net.Compilers:请参阅 ***.com/a/36774876/584714 是否有无需在每个项目中安装 nuget 包的解决方案?我有 100 个需要这个的项目,这对我来说似乎没有必要。好像是某个地方的错误。 有人回答@ColeW 的问题吗?【参考方案2】:您也可以在构建服务器上安装“Microsoft Build Tools 2015”而不是 VS2015。
https://www.microsoft.com/en-us/download/details.aspx?id=48159
它将 MSBuild 安装到相同的路径:
C:\Program Files (x86)\MSBuild\14.0\Bin\MsBuild.exe
【讨论】:
恕我直言,这是有原因的,为什么这个问题与那个环境有关。最好对问题发表评论。 由于 *** 不允许我对问题发表评论,我以系统允许的唯一方式发布它。如果您觉得它没有用,请忽略它。对我来说,在我的构建服务器上搜索解决方案时,这是要走的路,而不是安装 VS2015 安装“Microsoft Build Tools 2015”(或“Microsoft Build Tools 2017”)后,您还可以控制要用于构建解决方案的 Visual Studio 版本:MSBuild.exe / t:Build YourSolution.sln /p:VisualStudioVersion=14.0 [VS2010 设置为 10.0,VS2015 设置为 14.0,VS2017 设置为 15.0] 要下载和安装 Microsoft Build Tools 2015 Update 3,请访问 older VS downloads 并转到Redistributables and Build Tools
部分。【参考方案3】:
您可能已经有这个工作,但这可能会在未来帮助其他人。我最近遇到了这个问题,它让我朝着正确的方向前进并最终找到了解决方案。
另一种可能的解决方案是手动更新您的项目文件,以针对您希望构建项目的 MSBuild 版本。
我最近完成了 TeamCity 构建服务器更新,并且已经在其上安装了 Microsoft Build Tools 2015。我以为我在构建服务器上准备好了所有东西,我的解决方案针对 C# 6.0,我的每个项目都针对 .net 4.6.1。和你一样,在我的本地环境中构建 C# 6.0 特定代码的一切都很好,但我的 TeamCity 构建服务器不喜欢它。
正如其他人所提到的,我尝试使用 Microsoft.Net.Compilers NuGet 包。它的最新版本允许构建在我的构建服务器上运行,但它不允许我在本地发布我的代码(我的要求)。该 NuGet 包的早期版本可以让我发布,但构建不起作用。
我发现我必须最终修改解决方案中的每个项目文件,以专门针对可以处理 C# 6.0 代码的 MSBuild 版本。在我的每个项目文件中,我找到了类似于以下行的一行:
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
该行的关键组成部分是它的 ToolsVersion 部分。我只是将项目文件中的这一行更改为以下内容:
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
这里的区别在于我的目标是版本 14,而不是 4。版本 14.0 对应于 Build Tools 2015。通过更改此设置,我的 TeamCity 构建服务器使用了正确的 MSBuild 版本,并且能够构建我的 C# 6.0 代码。
我还必须手动更新它的 TargetFrameworkVersion xml 节点以使用 4.6.1,因为 VS2015 没有做正确的事情并弄乱了我的本地构建,但这与这里无关。
如果我错了,请有人纠正我,但仅供参考,我认为版本号是这样的:
4.0 = VS2012
12.0 = VS2013
14.0 = VS2015
15.0 = VS2017
我相信如果你想使用 .net 4.7,你必须安装 Build Tools 2017 并且你的项目以 15.0 而不是 14.0 为目标,但我还没有验证这一点。
【讨论】:
以上是关于如何将 msbuild 升级到 C# 6?的主要内容,如果未能解决你的问题,请参考以下文章
Docs-VisualStudio-MSBuild-MSBuild参考:MSBuild 保留属性和已知属性