Microsoft.Net.Compilers包的CSC.exe不用于同一解决方案中的某些项目

时间:2017-03-08 03:35:44

标签: msbuild tfs2012

我们的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" />

如果需要,我可以添加更多调试语句。我还能做些什么来排除故障并解决这个问题?

1 个答案:

答案 0 :(得分:0)

您可以通过以下方式强制全面实施项目构建定义

在项目文件下面的语句

<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">     
<Import Project="..\packages\Microsoft.Net.Compilers.2.4.0\build\Microsoft.Net.Compilers.props" Condition="Exists('..\packages\Microsoft.Net.Compilers.2.4.0\build\Microsoft.Net.Compilers.props')" />