我有超过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忽略,并建立所有引用的项目。
问题是要恢复建造顺序,我可以在窗口ProjectBuildOrder如果我直接使用的MSBuild从控制台这是不正确的VisualStudio中看到。
请参阅使用MSBuild.exe时不正确的解决方案生成顺序在Visual Studio的博客:
遵循这样的原则:不使用的解决方案文件表示,在所有的依赖! 具有相关性的文件中更好地表达依赖性:提出在项目一期工程的参考,而不是。 在我们的例子,这将是一个项目引用从B到C.
你可能没有做过那样的事,因为你不想引用项目引用的目标,而只是责令建设。 然而,在4.0你可以创建一个项目的参考,只有订单生成不添加引用。 它应该是这样的-注意,元数据元素,而这一切是内部<ItemGroup>
当然标签:
<ProjectReference Include="foo.csproj"> <ReferenceOutputAssembly>false</ReferenceOutputAssembly> </ProjectReference>
请注意,您必须使用文本编辑器添加子元素 - Visual Studio可以添加项目引用,但对于这个元数据不公开UI。
除去现在已经不必要的行这样的 - - 我可以通过删除解决方案文件的依赖性,以及整理您的GUID会有所不同,但使用VS对话框,它会做的工作...
我有很多这样的问题。 它表现在溶液中,通过要求成功构建整个解决方案前两个版本。
事实证明,我不小心添加了一个参考 ,而不是一个ProjectReference(寻找这在.sln文件),这意味着VS / MSBuild的需要,并查找引用的库文件,但完全不知道,如果怎样建设它缺少。 最终,构建过程会围过来的项目,引用库,构建并使其可用于未来建设的尝试。
根据您的依赖关系树和MS工具链的特殊的情绪,这可能调高为零星的错误,从而可以调试婊子。
短版 :让被列为ProjectReference到解决方案中的项目一定的参考,而不只是参考 。 通过添加标签的解决方案 ,而不是浏览的参考和选择的DLL文件执行此操作。
该解决方案试图构建依赖于从.NET的核心项目输出一个.net标准项目时,上面为我做的不太工作。 我不得不为了得到解决建设VS2017和的MSBuild添加一个额外的“SkipGetTargetFrameworkProperties”。
<ProjectReference Include="foo.csproj">
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
<SkipGetTargetFrameworkProperties>true</SkipGetTargetFrameworkProperties>
</ProjectReference>