【问题标题】:Microsoft.Net.Compilers package's CSC.exe isn't used for some of the projects within the same solutionMicrosoft.Net.Compilers 包的 CSC.exe 未用于同一解决方案中的某些项目
【发布时间】: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


【解决方案1】:

您可以通过

强制强制执行项目构建定义

下面关于项目文件的声明

<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')" />

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    • 1970-01-01
    • 2017-09-09
    相关资源
    最近更新 更多