即使安装了 Microsoft.Net.Compilers,C# 6.0 构建也会在 TFS 构建上失败

Posted

技术标签:

【中文标题】即使安装了 Microsoft.Net.Compilers,C# 6.0 构建也会在 TFS 构建上失败【英文标题】:C# 6.0 builds fail on TFS Build even with Microsoft.Net.Compilers installed 【发布时间】:2017-01-08 15:56:50 【问题描述】:

我的公司有 TFS 2013。 我有一个使用 C# 6.0 特性的项目。 我的团队没有直接访问构建服务器的权限。 VS2015 尚未安装在那里,但管理服务器的人正在寻找安装 2015 构建工具。

与此同时,我已经安装了 Microsoft.Net.Compilers NuGet 包,如C# 6.0 TFS Builds 的答案和此处的其他几个问题中所述。

解决方案中的一些项目已经安装了它: (一个 Asp.Net MVC 5 项目和一个 Web API 项目。)

构建解决方案时,TFS 对某些项目使用包中的 Rosyln 编译器,对其他项目使用默认编译器。

我已删除并重新添加了包。 我尝试在包的 1.0.0、1.1.0 和 1.3.2 版本之间切换。 我并排打开了 .csproj 文件以寻找细微的差异。 我已经从同一个项目中创建了多个解决方案和多个构建定义,以查看是否某些组合导致了问题。 其中一个项目在一个构建的一部分时始终使用默认编译器进行构建,而在作为另一个构建的一部分构建时始终使用 Roslyn 编译器。

这两个 Web 项目从不使用 Roslyn 编译器。 还有 3 个其他库、一个控制台应用程序和一堆包含单元/集成测试的项目。 除了一个项目(其中一个库)的行为取决于它所在的构建版本之外,所有项目在它们使用的编译器中似乎都是一致的

我在这里缺少什么?为什么 TFS 可能会为某些项目使用包编译器而对其他项目不使用?

构建错误的抽样: 名称的使用:

SomeController.cs (53): The name 'nameof' does not exist in the current context

静态使用:

RedactedTests.cs (5): Identifier expected; 'static' is a keyword
RedactedTests.cs (5): Expected class, delegate, enum, interface, or struct

空合并运算符:

InterestingClassName.cs (40): Invalid expression term '.'
InterestingClassName.cs (40): Syntax error, ':' expected
InterestingClassName.cs (40): Invalid expression term '.'
InterestingClassName.cs (40): Syntax error, ':' expected

表达式主体属性:

MyClass.cs (11): ; expected
MyClass.cs (11): Method must have a return type
MyClass.cs (11): Type expected

【问题讨论】:

构建失败时您在日志中收到的详细错误消息是什么?此外,如果您在本地和构建代理机器上直接在 VS 中运行该 C#6.0 项目,在这两种情况下您会收到相同的错误消息吗? @Patrick-MSFT 错误消息是语法错误消息,根据导致失败的 C#6.0 功能而有所不同,但我将添加一些示例。一切都在本地建立在 VS2015 中。我的团队无法直接访问构建代理机器以在其中运行它,并且尚未安装 2015 工具。 您是否在解决方案中的每个项目上安装了 NuGet 包? -- 每个项目都需要安装。 @BrianSlugs83 我们最终让负责构建服务器的人员安装了 2015 工具,问题得到了解决。但是在解决方案中的每个项目上都安装了 NuGet 包时是的。 确保您已在构建机器上安装了最新的 MSbuild。还要确保您的项目配置为使用 c#6.0 或更高版本。确保您的构建任务使用最新的 MSBuild 或最新的 Visual Studio 来构建包含 C#6.0 项目/解决方案的项目 【参考方案1】:

可能使用 .sln 文件的版本,如果解决方案使用目标版本,请注意这一点。

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14
VisualStudioVersion = 14.0.25123.0
MinimumVisualStudioVersion = 10.0.40219.1

你能尝试改变吗?

【讨论】:

双重检查,所有解决方案都具有相同的版本。并且如问题所示,同一解决方案中的不同项目使用默认编译器或 nuget 包编译器构建。如果它依赖于解决方案版本,那么似乎所有项目都将使用 nuget 包编译器构建或全部使用默认值。

以上是关于即使安装了 Microsoft.Net.Compilers,C# 6.0 构建也会在 TFS 构建上失败的主要内容,如果未能解决你的问题,请参考以下文章

ImportError:没有名为 lxml 的模块 - 即使安装了 LXML

为啥即使安装了 FBX 模块也找不到?

即使似乎安装了 graphviz,如何在 HPC 集群上安装 pygraphviz 而不会出错?

即使安装了 gem,RVM Bundle Install Missing Gem 错误

ImportError:即使安装了 Mysqldb,也没有名为 MySQLdb 的模块

即使安装了@types/node,Typescript 也找不到模块“fs”