Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MSBuild生成顺序 我有一个大的解决方案,有100个项目(C++,管理C++,C语言),其中很多都依赖于其他。_Msbuild_Msbuild 4.0 - Fatal编程技术网

MSBuild生成顺序 我有一个大的解决方案,有100个项目(C++,管理C++,C语言),其中很多都依赖于其他。

MSBuild生成顺序 我有一个大的解决方案,有100个项目(C++,管理C++,C语言),其中很多都依赖于其他。,msbuild,msbuild-4.0,Msbuild,Msbuild 4.0,我有一个TeamCity服务器,我想在那里构建这个解决方案 当我在VisualStudio中构建解决方案时,一切正常,但对于TeamCity,我有一个CS0006错误。 我知道为什么so-TeamCity使用MSBuild 4来构建解决方案,但MSBuild 4中存在一个已知的错误-它忽略构建顺序,并根据解决方案按照它想要的顺序构建项目。 由于这种行为,如果您有: Project A Project B which has reference to A MSBuild可以按以下顺序生成这些项目

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

当我在VisualStudio中构建解决方案时,一切正常,但对于TeamCity,我有一个CS0006错误。 我知道为什么so-TeamCity使用MSBuild 4来构建解决方案,但MSBuild 4中存在一个已知的错误-它忽略构建顺序,并根据解决方案按照它想要的顺序构建项目。 由于这种行为,如果您有:

Project A
Project B which has reference to A
MSBuild可以按以下顺序生成这些项目:

1. B
2. A
最简单的解决方案是设置BuildProjectReferences=true(默认设置),所有引用的项目都将自动生成。但我不能使用这种方法,因为在这个解决方案中并不是所有引用的项目,而且我不能从另一个解决方案构建项目

下面是此问题的另一个修复方法-使用ConfigurationManager并禁用所有不应生成的项目,但它仅在VisualStudio中起作用-MSBuild将忽略该选项并生成所有引用的项目

问题是恢复生成顺序,我可以在VisualStudio的窗口中看到该顺序,如果我直接从控制台使用MSBuild,则该顺序不正确。

请参阅Visual Studio博客:

遵循这个原则:根本不要使用解决方案文件中表示的依赖项!最好在具有依赖关系的文件中表示依赖关系:改为在项目中放置项目引用。在我们的示例中,这将是从B到C的项目引用

您可能以前没有这样做过,因为您不想引用项目引用的目标,而只是命令构建。但是,在4.0中,您可以创建一个项目引用,该项目引用只对生成进行排序,而不添加引用。它看起来是这样的——注意元数据元素,所有这些都在
标记中,当然:

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

假的
请注意,您必须使用文本编辑器添加子元素—Visual Studio可以添加项目引用,但不公开此元数据的UI

我也可以通过删除解决方案文件中的依赖项来进行整理-现在删除不必要的行,如这样-您的GUID将不同,但使用VS对话框,它将完成此工作


我有一个很像这样的问题。它在解决方案中表现出来,在成功构建整个解决方案之前需要两次构建

事实证明,我无意中添加了一个引用而不是ProjectReference(请在.sln文件中查找),这意味着VS/MSBuild将需要并查找引用的库文件,但如果缺少它,则完全不知道如何构建它。最终,构建过程将带着引用的库来到项目中,构建它并使其可用于下一次构建尝试

根据您的依赖关系树和MS工具链的特定情绪,这可能会成为一个偶发错误,因此很难调试


简短版本:确保解决方案中对项目的引用列为ProjectReference,而不仅仅是Reference。为此,请在“解决方案”选项卡上添加引用,而不是浏览和拾取DLL文件。

在尝试构建依赖于.Net核心项目输出的.Net标准项目时,上述解决方案对我来说并不太有效。我必须添加额外的“SkipGetTargetFrameworkProperties”,以便在VS2017和MSBuild中生成解决方案

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

假的
真的

这是一个相当普遍的问题,你能更具体一点吗?它是在visual studio中生成的吗?不是,我使用JetBrains TeamCity server,它使用MSBuild。如果我从VisualStudio运行build,一切都会很好。您能更具体一点吗?如何修复什么?您想修复预生成事件还是在禁用生成项目引用时修复生成?我熟悉TeamCity。您是否在其配置中引用解决方案文件?实际的构建错误是什么?看起来你在假设某种“已知的问题”,但所有这些东西几乎都是有效的,除非你在做一些深奥的事情。100个项目并不可怕,我已经在CI下构建了约350个项目。我更新了问题,并试图更具体地说明,除非这些项目针对相同的框架,否则它不起作用:(这太神奇了。花了3天的时间试图解决这个问题。你知道什么会导致引用被添加为引用而不是项目引用吗?如果有一个工具可以找到所有出现的引用,那就太好了。在我的情况下,这是在项目文件中,而不是解决方案文件中