在Visual Studio中构建的代码将无法在TFS中生成

问题描述 投票:1回答:2

我在C#类中定义了两个扩展方法。当我编译在Visual Studio 2015中使用这些扩展方法的代码时,它们可以正确编译。当我在本地Team Foundation Build Server上运行相同的代码时,使用MSBuild 2015和/p:VisualStudioVersion=14.0,代码将无法编译。我需要采取哪些额外步骤来配置构建服务器以便代码编译?

这些是相关的方法签名

    public static IEnumerable<TResult> LeftOuterJoin<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, TInner, TResult> resultSelector) where TInner : class;
    public static IEnumerable<TResult> LeftOuterJoin<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, TInner, TResult> resultSelector) where TInner : class

这是构建服务器上的编译错误:

我在C#类中定义了两个扩展方法。当我编译在Visual Studio 2015中使用这些扩展方法的代码时,它们可以正确编译。当我在本地Team Foundation Build Server上运行相同的代码时,使用MSBuild 2015和/p:VisualStudioVersion=14.0,代码将无法编译。我需要采取哪些额外步骤来配置构建服务器以便代码编译?

这些是相关的方法签名

public static IEnumerable<TResult> LeftOuterJoin<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, TInner, TResult> resultSelector)
    where TInner : class;
public static IEnumerable<TResult> LeftOuterJoin<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, TInner?, TResult> resultSelector)
    where TInner : struct;

基于构建服务器中的编译器错误,看起来构建过程接受方法的“where TInner:struct”版本作为合适的重载,即使TInner是引用类型,而我的开发机器上的Visual Studio不是认为这些方法含糊不清。这是构建服务器上的编译错误:

The call is ambiguous between the following methods or properties:
'Extensions.LeftOuterJoin<AnonymousType#1,ReferenceType,AnonymousType#2,AnonymousType#3>(System.Collections.Generic.IEnumerable<AnonymousType#1>, System.Collections.Generic.IEnumerable<ReferenceType>, System.Func<AnonymousType#1,AnonymousType#2>, System.Func<ReferenceType,AnonymousType#2>, System.Func<AnonymousType#1,ReferenceType,AnonymousType#3>)'
and
'Extensions.LeftOuterJoin<AnonymousType#1,ReferenceType,AnonymousType#2,AnonymousType#4>(System.Collections.Generic.IEnumerable<AnonymousType#1>, System.Collections.Generic.IEnumerable<ReferenceType>, System.Func<AnonymousType#1,AnonymousType#2>, System.Func<ReferenceType,AnonymousType#2>, System.Func<AnonymousType#1,ReferenceType?,AnonymousType#4>)'
c# tfs msbuild visual-studio-2015
2个回答
2
投票

如果您使用的是TFS2015,则必须确保构建计算机上的构建环境与本地开发计算机相同。您应该在构建计算机上安装VS2015。

如果您使用的是TFS2013或TFS2012,则此/p:VisualStudioVersion=14.0参数不起作用。您需要自定义tfs构建过程模板,以将Run MSBuild for Project的ToolPath设置为MSBuild14;并将ToolVersion设置为“14.0”。检查这个BuildActivity ignores ToolsVersion的deatils。


0
投票

我知道这是一个老帖子,但只是为了扩展一点答案,如果您使用TFS2015,您有两个选项来编译代码,一个使用VisualStudio构建任务,另一个使用MSBuild任务,I建议选择第一个。有时,为了定位MSBuild14,您还有两个选择

1-直接将MSBuild14定位为@ Patrick-MSFT说2 - 而不是1,您可以在名为Microsoft.Net.Compilers的项目中包含Nuget依赖项,此答案时的版本2.0.1是正确的版本获取最新版本的C#编译器作为构建的一部分运行。看看我的答案:https://stackoverflow.com/a/42931980/819153

但是大多数人不喜欢在同一个解决方案上更新所有项目来定位nuget包。您需要在服务器上安装最新版本的Microsoft Tools 2015,而不是这样做,您可以从这里下载https://www.microsoft.com/en-us/download/details.aspx?id=48159

根据我的经验,您需要深入了解,代理商有能力,一旦您创建代理,它就会发现您的机器的功能,它知道您安装的MSBuild的版本,在某些情况下,人们在运行代理后安装MSBuild。我的建议,停止代理并在安装MSBuild后重新创建它们。避免TFS服务器出现问题的最安全的方法是在那里安装Visual Studio 2015,在重新编写代理之后,所有内容都与最新版本的MSBuild以及最新版本的Visual Studio完美运行。安装Microsoft Tools 2015并未在TFS上提供最新版本的Visual Studio文件夹。因此您可以安装它,或者代替它创建MSBuild任务并传递您需要的所有参数

希望这可以帮助

© www.soinside.com 2019 - 2024. All rights reserved.