在 Visual Studio 中构建的代码不会在 TFS 中构建
Code that Builds in Visual Studio Won't Build in TFS
我在 C# class 中定义了两个扩展方法。当我在 Visual Studio 2015 年编译使用这些扩展方法的代码时,它们编译正确。当我 运行 在本地 Team Foundation Build Server 上使用带有 /p:VisualStudioVersion=14.0 的 MSBuild 2015 时,代码将无法编译。我需要采取哪些额外步骤来配置构建服务器以便代码能够编译?
这些是相关的方法签名
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# class 中定义了两个扩展方法。当我在 Visual Studio 2015 年编译使用这些扩展方法的代码时,它们编译正确。当我 运行 在本地 Team Foundation Build Server 上使用带有 /p:VisualStudioVersion=14.0 的 MSBuild 2015 时,代码将无法编译。我需要采取哪些额外步骤来配置构建服务器以便代码能够编译?
这些是相关的方法签名
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;
根据构建服务器中的编译器错误,即使 TInner 是引用类型,构建过程似乎正在接受方法的 "where TInner : struct" 版本作为合适的重载,而 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>)'
如果您使用的是TFS2015,您必须确保您的构建机器上的构建环境与您本地的开发机器相同。你应该在你的构建机器上安装 VS2015。
如果您使用的是 TFS2013 或 TFS2012 ,则此 /p:VisualStudioVersion=14.0
参数无效。您需要自定义tfs构建流程模板,将运行 MSBuild for Project的ToolPath设置为目标为MSBuild14;并将 ToolVersion 设置为“14.0”。检查此 以获取详细信息。
我知道这是一个旧的 post,但只是稍微扩展一下答案,如果您使用的是 TFS2015,则有两种编译代码的选项,一种是使用 VisualStudio Build Task另一个是 MSBuild 任务,我建议使用第一个。有时要以 MSBuild14 为目标,您还有两个选择
1- 如@Patrick-MSFT 所说,直接针对 MSBuild14
2 - 而不是 1,您可以在名为 Microsoft.Net.Compilers 的项目中包含 Nuget 依赖项,此答案时的版本 2.0.1 是获取最新版本的 C# 编译器的正确版本 运行ning 作为构建的一部分。在这里也看看我的回答:
但是大多数人不喜欢更新同一解决方案上的所有项目以针对该 nuget 包。您需要在服务器上安装最新版本的 Microsoft Tools 2015,而不是这样做,您可以从此处下载 https://www.microsoft.com/en-us/download/details.aspx?id=48159
现在根据我的经验,你需要深入了解一下,你的代理有能力,一旦你创建了一个代理,它就会发现你机器的能力,它知道你安装的 MSBuild 的版本,在某些情况下,人们在拥有代理 运行ning 之后安装 MSBuild。我的建议是停止代理并在安装 MSBuild 后重新创建它们。避免 TFS 服务器出现问题的最安全方法是在那里安装 Visual Studio 2015,在用最新版本的 MSBuild 和最新版本的 [=23] 完美重做我的代理后 运行 =].
安装 Microsoft Tools 2015 不会为您提供 TFS 上最新版本的 Visual Studio 文件夹。所以你可以安装它,或者创建 MSBuild 任务并传递你需要的所有参数
希望对您有所帮助
我在 C# class 中定义了两个扩展方法。当我在 Visual Studio 2015 年编译使用这些扩展方法的代码时,它们编译正确。当我 运行 在本地 Team Foundation Build Server 上使用带有 /p:VisualStudioVersion=14.0 的 MSBuild 2015 时,代码将无法编译。我需要采取哪些额外步骤来配置构建服务器以便代码能够编译?
这些是相关的方法签名
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# class 中定义了两个扩展方法。当我在 Visual Studio 2015 年编译使用这些扩展方法的代码时,它们编译正确。当我 运行 在本地 Team Foundation Build Server 上使用带有 /p:VisualStudioVersion=14.0 的 MSBuild 2015 时,代码将无法编译。我需要采取哪些额外步骤来配置构建服务器以便代码能够编译?
这些是相关的方法签名
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;
根据构建服务器中的编译器错误,即使 TInner 是引用类型,构建过程似乎正在接受方法的 "where TInner : struct" 版本作为合适的重载,而 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>)'
如果您使用的是TFS2015,您必须确保您的构建机器上的构建环境与您本地的开发机器相同。你应该在你的构建机器上安装 VS2015。
如果您使用的是 TFS2013 或 TFS2012 ,则此 /p:VisualStudioVersion=14.0
参数无效。您需要自定义tfs构建流程模板,将运行 MSBuild for Project的ToolPath设置为目标为MSBuild14;并将 ToolVersion 设置为“14.0”。检查此
我知道这是一个旧的 post,但只是稍微扩展一下答案,如果您使用的是 TFS2015,则有两种编译代码的选项,一种是使用 VisualStudio Build Task另一个是 MSBuild 任务,我建议使用第一个。有时要以 MSBuild14 为目标,您还有两个选择
1- 如@Patrick-MSFT 所说,直接针对 MSBuild14
2 - 而不是 1,您可以在名为 Microsoft.Net.Compilers 的项目中包含 Nuget 依赖项,此答案时的版本 2.0.1 是获取最新版本的 C# 编译器的正确版本 运行ning 作为构建的一部分。在这里也看看我的回答:
但是大多数人不喜欢更新同一解决方案上的所有项目以针对该 nuget 包。您需要在服务器上安装最新版本的 Microsoft Tools 2015,而不是这样做,您可以从此处下载 https://www.microsoft.com/en-us/download/details.aspx?id=48159
现在根据我的经验,你需要深入了解一下,你的代理有能力,一旦你创建了一个代理,它就会发现你机器的能力,它知道你安装的 MSBuild 的版本,在某些情况下,人们在拥有代理 运行ning 之后安装 MSBuild。我的建议是停止代理并在安装 MSBuild 后重新创建它们。避免 TFS 服务器出现问题的最安全方法是在那里安装 Visual Studio 2015,在用最新版本的 MSBuild 和最新版本的 [=23] 完美重做我的代理后 运行 =]. 安装 Microsoft Tools 2015 不会为您提供 TFS 上最新版本的 Visual Studio 文件夹。所以你可以安装它,或者创建 MSBuild 任务并传递你需要的所有参数
希望对您有所帮助