【发布时间】:2017-03-08 03:35:44
【问题描述】:
我们的 TFS 构建服务器是 2012 版,我尝试用它来编译 C#6 和 C#7 代码,并根据项目选择加入。我在c-sharp-6-0-tfs-builds 中遵循了简单的步骤。带有单个 MVC Web 项目的示例解决方案工作得很好。另一种具有多个项目的解决方案也可以正常工作,但我在日志中注意到其中一个项目使用v4.0.30319\Csc.exe 而不是packages\Microsoft.Net.Compilers.2.0.0-rc4\build\..\tools\csc.exe。我想迁移到最新版本的另一种解决方案(MVC Web)也部分工作,即一个项目(简单类库)在 MVC Web 项目失败时编译良好。
我添加了一些调试语句来跟踪 MSBuild 变量,这里是两个项目的两组输出,具有相同的解决方案。解决方案在本地编译得很好(在 VS2015 中)。 msbuild 参数包括/tv:14.0 /p:GenerateBuildInfoConfigFile=false /p:VisualStudioVersion=14.0。我尝试了各种无参数组合,只有 VisualStudioVersion 等等。
此项目是一个类库,MSBuild 使用 Microsoft.Net.Compilers 包中的编译器
DebugWriteVariousVariables:
BeforeTargets: CoreResGen
UseSharedCompilation : false
MSBuildThisFileDirectory : C:\Builds\2\MyApp\Sources\MyApp.ServiceFacade\
MSBuildToolsVersion : 14.0
BuildingProject : true
VisualStudioVersion : 14.0
VSToolsPath :
MSBuildBinPath : C:\Program Files (x86)\MSBuild\14.0\bin\amd64
MSBuildExtensionsPath32 : C:\Program Files (x86)\MSBuild
CscToolPath : C:\Builds\2\MyApp\packages\Microsoft.Net.Compilers.2.0.0-rc4\build\..\tools
CscToolExe : csc.exe
GenerateTargetFrameworkMonikerAttribute:
Skipping target "GenerateTargetFrameworkMonikerAttribute" because all output files are up-to-date with respect to the input files.
CoreCompile:
C:\Builds\2\MyApp\Sources\MyApp\packages\Microsoft.Net.Compilers.2.0.0-rc4\build\..\tools\csc.exe /noconfig /nowarn:1701,1702 ...
这个项目是 MVC Web 并且 MSBuild 不使用 Microsoft.Net.Compilers 包中的编译器
DebugWriteVariousVariables:
BeforeTargets: CoreResGen
UseSharedCompilation :
MSBuildThisFileDirectory : C:\Builds\2\MyApp\Sources\MyApp\
MSBuildToolsVersion : 14.0
BuildingProject : true
VisualStudioVersion : 14.0
VSToolsPath : C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0
MSBuildBinPath : C:\Program Files (x86)\MSBuild\14.0\bin\amd64
MSBuildExtensionsPath32 : C:\Program Files (x86)\MSBuild
CscToolPath : C:\Windows\Microsoft.NET\Framework64\v4.0.30319\
CscToolExe :
GenerateTargetFrameworkMonikerAttribute:
Skipping target "GenerateTargetFrameworkMonikerAttribute" because all output files are up-to-date with respect to the input files.
CoreCompile:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Csc.exe /noconfig /nowarn:1701,1702 /nostdlib+ /errorreport:prompt /warn:4 ...
我可以看到CscToolPath 设置不正确。我已经阅读了Microsoft.Net.Compilers.props 的内容,但我无法理解为什么会这样。我已阅读 .csproj 文件的内容并进行了比较。在构建项目方面唯一明显的区别似乎是以下两个包括
<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\WebApplications\Microsoft.WebApplication.targets" Condition="false" />
如果需要,我可以添加更多调试语句。我还能做些什么来排除故障和解决这个问题?
【问题讨论】:
-
会不会是因为 MVC 的 webapplication 目标文件直接引用了编译器?构建服务器与您的工作开发机器的可比性如何?
-
@LeonG 这些在我的机器和构建服务器中是相同的。此外,这些似乎都与编译无关,但这是我在比较有效项目和无效项目的 csproj 文件时注意到的一个明显区别。
标签: msbuild