igo*_*fed 23 msbuild msbuild-4.0
我有一个包含100多个项目的大型解决方案(C++,Managed C++,C#),其中许多项目都依赖于彼此.
我有一个TeamCity服务器,我想在那里构建这个解决方案.
当我在VisualStudio中构建解决方案时,一切都很顺利,但是对于TeamCity,我有一个CS0006错误.我知道为什么这样 - TeamCity使用MSBuild 4来构建解决方案,但MSBuild 4中存在一个已知的错误 - 它忽略了构建顺序并按照它想要的方式从解决方案构建项目.因为这种行为,如果你有:
Project A
Project B which has reference to A
Run Code Online (Sandbox Code Playgroud)
MSBuild可以按以下顺序构建这些项目:
1. B
2. A
Run Code Online (Sandbox Code Playgroud)
最简单的解决方案是设置BuildProjectReferences = true(默认值),并自动构建所有引用的项目.但是我不能使用这种方法,因为在这个解决方案中不是所有引用的项目,我不能从另一个解决方案构建项目.
这是另一个解决此问题的方法 - 使用ConfigurationManager并禁用所有不应构建的项目,但它仅适用于VisualStudio - MSBuild忽略它并构建所有引用的项目.
问题是恢复我在VisualStudio窗口ProjectBuildOrder中可以看到的构建顺序,如果我直接从Console使用MSBuild,则不是这样.
小智 25
在Visual Studio博客中使用MSBuild.exe时,请参阅不正确的解决方案构建顺序:
遵循以下原则:不要使用解决方案文件中表达的依赖关系!最好在具有依赖关系的文件中表达依赖关系:将项目引用放在项目中.在我们的示例中,这将是从B到C的项目引用.
您之前可能没有这样做,因为您不想引用项目引用的目标,而只是命令构建.但是,在4.0中,您可以创建仅在不添加引用的情况下对构建进行排序的项目引用.它看起来像这样 - 注意元数据元素,
<ItemGroup>当然这一切都在标记内:Run Code Online (Sandbox Code Playgroud)<ProjectReference Include="foo.csproj"> <ReferenceOutputAssembly>false</ReferenceOutputAssembly> </ProjectReference>请注意,您必须使用文本编辑器添加子元素 - Visual Studio可以添加项目引用,但不会公开此元数据的UI.
我也可以通过删除解决方案文件中的依赖项来整理 - 删除现在这样不必要的行 - 你的GUID会有所不同,但是使用VS对话框它会完成工作......
在尝试构建依赖于 .Net Core 项目输出的 .Net Standard 项目时,上面的解决方案对我来说不太适用。我必须添加一个额外的“SkipGetTargetFrameworkProperties”才能获得在 VS2017 和 MSBuild 中构建的解决方案。
<ProjectReference Include="foo.csproj">
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
<SkipGetTargetFrameworkProperties>true</SkipGetTargetFrameworkProperties>
</ProjectReference>
Run Code Online (Sandbox Code Playgroud)
我有一个像这样的问题.它通过在成功构建整个解决方案之前需要两个构建来体现在解决方案中.
事实证明,我偶然添加了一个Reference而不是ProjectReference(在.sln文件中查找),这意味着VS/MSBuild需要并查找引用的库文件,但完全不知道如何构建它它不见了.最终,构建过程将通过引用的库到达项目,构建它并使其可用于下一次构建尝试.
根据您的依赖关系树和MS工具链的特定情绪,这可能会出现偶发错误,因此是一个调试的婊子.
简短版本:确保对解决方案内的项目的引用列为ProjectReference,而不仅仅是Reference.通过在" 解决方案"选项卡上添加引用而不是浏览和选择DLL文件来执行此操作.
| 归档时间: |
|
| 查看次数: |
14884 次 |
| 最近记录: |