MSBuild maxcpucount> 1导致构建错误

时间:2008-12-12 05:16:02

标签: c# optimization msbuild multicore multi-targeting

我正在尝试构建大约600个项目,有些是.net 2.0,有些是3.5。我正在使用Windows 2003企业版32位以及所有最新的Windows更新。

当maxcpucount为1时构建正常。如果我尝试提高性能,则会出现引用错误。当我查看错误发生位置的项目引用时,它们应该按顺序构建。

下面我提供了一个导致构建被破坏的错误示例。不要挂在项目名称或相关路径上,因为我已经改变了这一点,所以我不会对我的雇主遇到麻烦。

当多个核心构建解决方案时,无法正确解析相对项目引用。

"C:\SVN\MyLibrary\MyLibrary.csproj" (default target) (15) ->
   "C:\SVN\FileProcessor\FileProcessor.csproj" (default target) (17) ->
   (ResolveProjectReferences target) ->
     C:\WINDOWS\Microsoft.NET\Framework\v3.5\Microsoft.Common.targets : warning : The referenced project '..\..\Manager\Manager.csproj' does not exist.


   "C:\SVN\MyLibrary\MyLibrary.csproj" (default target) (15) ->
   "C:\SVN\FileProcessor\FileProcessor.csproj" (default target) (17) ->
   (CoreCompile target) ->
     FileProcessor.cs(18,39): error CS0234: The type or namespace name 'Manager' does not exist in the namespace 'TheNamespace' (are you missing an assembly reference?)

我没有在解决方案文件上使用msbuild。我正在使用通配符选择所有csproj文件,然后将它们提供给msbuild。对于开发,我们有多个解决方案,我们用于系统的不同组件。 95%是项目引用,唯一的二进制引用是核心实用程序库

2 个答案:

答案 0 :(得分:5)

为了使MSBuild能够运行多个核心/ cpus,它需要能够事先确定所有依赖关系是什么。通常,这意味着您需要将所有项目都放在一个巨大的解决方案中,并将所有引用设置为项目引用或设置多个解决方案并将它们设置为以正确的顺序构建。

听起来您现在正在运行单一解决方案版本,因此您需要确保所有对其他项目的引用都正确设置为项目引用,而不是文件路径引用。

我还没有找到一个很好的方法来检查这个GUI,所以你可能不得不卸载和编辑一个不在multicpu中构建的项目文件来查看xml。

项目参考应如下所示:


<ProjectReference Include="..\..\Manager\Manager.csproj">
      <Project>{C0F60D74-3EF9-4B49-9563-66E70D0DDF43}</Project>
      <Name>Manager</Name>
</ProjectReference>

并且文件路径引用如下所示:


<Reference Include="Manager.dll, Version=2.0.0.0, Culture=neutral, PublicKeyToken=e79aa50eb4f67b0c, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>....\Manager\Manager.dll</HintPath>
</Reference>

看起来您至少有一些参考设置正确,因为您的错误消息至少有一个呼叫到另一个项目,所以您不需要更新所有内容,只需检查这对夫妇给你带来麻烦。

答案 1 :(得分:0)

我可能会很晚,你可能已经解决了这个问题。但我遇到了同样的错误,发现这是由于我的一个项目的路径长度太大。 请参阅here