MSBuild的构建顺序

问题描述 投票:21回答:3

我有超过100个项目(C ++,托管C ++,C#)一个大的解决方案,其中许多人依赖于对方。

我有一个的TeamCity服务器,我想构建此解决方案在那里。

当我建立的VisualStudio一切的解决方案去罚款,但TeamCity的我有一个CS0006错误。我知道这是为什么如此 - 的TeamCity使用的MSBuild 4构建解决方案,但在4的MSBuild一个已知的bug - 它忽略了建立秩序和构建解决方案,从项目就是了顺序。由于这种行为的如果您有:

Project A
Project B which has reference to A

的MSBuild可以建立在这样的顺序对这些项目:

1. B
2. A

最简单的办法是设置BuildProjectReferences = true(此为默认)和所有引用的项目将被自动建造。但我不能用这个方法,因为在这个解决方案不是所有引用的项目,我不能从另一个解决方案打造的项目。

这里是另一个修复这个问题 - 使用ConfigurationManager中并禁用所有的项目,不应该建,但它只能在VisualStudio中 - 的MSBuild忽略,并建立所有引用的项目。

问题是要恢复建造顺序,我可以在Visual Studio中看到窗口项目构建顺序,如果我直接使用的MSBuild从控制台,它是不正确的。

msbuild msbuild-4.0
3个回答
23
投票

Incorrect solution build ordering when using MSBuild.exe在Visual Studio的博客:

遵循这样的原则:不使用的解决方案文件表示,在所有的依赖!具有相关性的文件中更好地表达依赖性:提出在项目一期工程的参考,而不是。在我们的例子,这将是一个项目引用从B到C.

你可能没有做过那样的事,因为你不想引用项目引用的目标,而只是责令建设。然而,在4.0你可以创建一个项目的参考,只有订单生成不添加引用。它应该是这样的 - 注意,元数据元素,而这一切当然是<ItemGroup>标签内:

<ProjectReference Include="foo.csproj">
    <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
</ProjectReference>

请注意,您必须使用文本编辑器添加子元素 - Visual Studio可以添加项目引用,但对于这个元数据不公开UI。

除去现在已经不必要的行这样的 - - 我可以通过删除解决方案文件的依赖性,以及整理您的GUID会有所不同,但使用VS对话框,它会做的工作...


6
投票

我有很多这样的问题。它表现在溶液中,通过要求成功构建整个解决方案前两个版本。

事实证明,我不小心添加了一个参考,而不是一个ProjectReference(寻找这在.sln文件),这意味着VS / MSBuild的需要,并查找引用的库文件,但完全不知道,如果怎样建设它缺少。最终,构建过程会围过来的项目,引用库,构建并使其可用于未来建设的尝试。

根据您的依赖关系树和MS工具链的特殊的情绪,这可能调高为零星的错误,从而可以调试婊子。

短版:让被列为ProjectReference到解决方案中的项目一定的参考,而不只是参考。通过添加标签的解决方案,而不是浏览的参考和选择的DLL文件执行此操作。


1
投票

该解决方案试图构建依赖于从.NET的核心项目输出一个.net标准项目时,上面为我做的不太工作。我不得不为了得到解决建设VS2017和的MSBuild添加一个额外的“SkipGetTargetFrameworkProperties”。

<ProjectReference Include="foo.csproj">
    <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
    <SkipGetTargetFrameworkProperties>true</SkipGetTargetFrameworkProperties>
</ProjectReference>
© www.soinside.com 2019 - 2024. All rights reserved.