MSBuild无法编译但通过了Visual Studios 2017

时间:2019-05-07 00:34:37

标签: c# jenkins msbuild visual-studio-2017

我的项目在VS2017中成功构建,但在Jenkins上使用旧的MSBuild(v14.0 C:\ Program Files(x86)\ MSBuild \ 14.0 \ Bin \ MSBuild.exe)失败。错误日志显示缺少诸如半冒号和大括号之类的字符。我查看了失败的文件,并且大多数“错误”都引用了下面的此方法调用。

if (cache.TryGetProxyById<ResultTagTypeProxy, ResultTagType>(this.ResultTagTypeId, out var existingTagType))
                this.ResultTagType = existingTagType;
public TProxy GetOrCreateProxy<TProxy, TModel>(TModel navModel, Func<TModel, ProxyCache, TProxy> proxyConstructor)
            where TProxy : ModelProxyBase<TModel>
            where TModel : IDatabaseEntity
        {
            TProxy navProxy = null;

            // Set the navigation property if it already exists in the cache by model
            if (this.TryGetProxyByModel<TProxy, TModel>(navModel, out var existingProxy))
                navProxy = existingProxy;
            else if (navModel != null)
            {
                // Else try loading by id
                if (this.TryGetProxyById<TProxy, TModel>(navModel.Id, out existingProxy))
                    navProxy = existingProxy;
                // Else create a
                else
                    navProxy = proxyConstructor(navModel, this);
            }

            return navProxy;
        }

我相信问题是因为此MSBuild不支持C#7的新功能,因此我需要下载一个新的MSBuild。我一直在使用Chocolatey安装软件包,并安装了“ microsoft-build-tools”。

在构建工具路径(C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ BuildTools \ MSBuild \ 15.0 \ Bin \ MSbuild.exe)中使用新的MSBuild,我发现存在不同的编译错误。第一个错误是我的一个项目需要参考netstandard 2.0。修复该参考之后,在我的功能测试项目中找不到更多参考。

我想知道是否会发生此更改(从MSBuild 14.0更改为MSBuild 15.0)。功能测试项目之前的所有内容都可以成功编译...

3 个答案:

答案 0 :(得分:1)

您应该使用msbuild.exe的VS 2017(构建工具)版本,该版本位于VS 2017安装文件夹中,而不位于C:\ Program Files(x86)\ MSBuild中。我建议使用vswhere来定位msbuild.exe的路径。

或者,您可以在项目中使用Microsoft.Net.Compilers NuGet包来获取最新的C#编译器来替换MSBuild / Visual Studio使用的默认编译器,但是在开发时它也会覆盖工具集,从而减慢了编译速度并引起不同的诊断和行为。

答案 1 :(得分:1)

  

我想知道是否会发生这种变化(从MSBuild 14.0迁移到MSBuild   15.0)。功能测试项目之前的所有内容都可以成功编译...

1。我们始终建议使用版本与vs版本相对应的msbuild工具。

由于您的项目来自VS2017,因此可以很好地构建。当您需要在VS IDE外部进行构建时,Build tools for VS2017(Msbuild 15.0)软件包应该是不错的选择。

ps:VS2015 <=> MSBuild14.0,VS2017 <=> MSBuild15.0

msbuild.exe软件包中build tools for vs2017的默认路径:C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin

2。另外,如Jonathon的评论中所述,要支持C#7功能,我们需要使用Msbuild15.0版本。

假定您有两个项目(A和B,A不使用C#7和B)。在CI服务器中,可以使用msbuild14.0来构建B,而不能使用A,如果您具有msbuild15.0,则可以使用用来建造A,B等。

所以我认为从14.0迁移到15.0是一个预期的选择。

此外:

在vs中创建一个新的C#项目,然后右键单击Project => Properties => Build => Advanced,您可以找到语言版本列表。

vs2015和msbuild14.0的第一张图片,vs2017和msbuild15.0的第二张图片:

enter image description here enter image description here

答案 2 :(得分:1)

您的msbuild14是Visual Studio 2015 您必须使用msbuild15。