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

时间:2015-11-25 01:29:14

标签: c# tfs msbuild visual-studio-2015

我在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>)'

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

1-直接定位MSBuild14,@ Patrick-MSFT说 2 - 您可以在名为Microsoft.Net.Compilers的项目中包含Nuget依赖项,而不是1,在此答案时版本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任务并传递你需要的所有参数

希望这有帮助