VS2010/MSBuild 4.0构建外部项目

3
自VS2010和MSBuild 4.0以来,VisualStudio和MSBuild似乎能够解析和构建不位于解决方案中的项目引用。
让我们创建一个示例以更具体地说明。创建一个名为“Solution1”的解决方案,其中包含一个名为“A”的C#项目和另一个名为“B”的项目。在“项目B”中,添加对“项目A”的引用。现在创建一个新的解决方案,并单击“添加现有项目”,然后选择“项目B”。可以在解决方案资源管理器和警告列表中看到警告。
关键是即使出现“警告作为错误”,我们仍然能够构建“Solution2.sln”。实际上,Visual Studio或MSBuild可以找到并构建“项目A”。让我们通过打开VS2010 / VS2012命令行并执行以下命令来验证这一点:
msbuild <dirPathToSolution1> Solution1.sln /t:clean **cleaning up solution1 with project A"
msbuild <dirPathToSolution1> Solution2.sln /t:build
< p > ProjectA 已经构建完成,更糟糕的是:上述警告甚至没有被提及。在之前的Visual Studio版本中,这种情况不可能发生(我已经用msbuild 3.5和VS2008进行了测试)。

然而,在我们的情况下,我们希望防止这种情况的发生。事实上,我们有一个大型源代码库,其中包含多个解决方案和许多开发人员。我们正在重新组织我们的依赖关系,最终旨在提取较小的存储库。与此同时,我们不希望开发人员添加隐藏的项目依赖项而不加注意。我们只想允许解决方案内部的项目引用,将其他依赖关系留给程序集引用。

因此,问题是“是否有方法可以防止 Solution2 进行编译?”。理想情况下,它不应该在VS2012和MSBuild中编译。然而,只涉及MSBuild命令行的解决方案将通过我们的持续集成工具运行。


1个回答

1

编辑我已经检查了Microsoft.Common.Targets文件,似乎没有任何方法可以实现你想要的功能。无论是项目引用都已经构建完成,还是没有(这受到我原始答案中BuildProjectReferences标志的影响)。除非我错过了什么 - 这主要是因为项目参考是设置在项目级别而不是解决方案级别上,所以没有办法根据它们所在的解决方案有选择地构建它们:在您的项目文件中有一个名为ProjectReferences的MsBuild ItemGroup,并且正在使用它。(实际上,这是有些道理的:如果您要求MsBuild构建projectB.csproj,并且B表示它引用A,那么就不需要解决方案,您可以期望它构建A,毕竟您正在引用它)。

现在据我所知,您想禁止跨目录引用,其结构恰好由解决方案表示。如果是这种情况,并且您确实需要这样做,那么您可能可以通过解析MsBuild日志并查找类似于以下行的行来摆脱:

Project "somedir\projectB.csproj" (2) is building "someOtherDir\projectA.csproj" (3) ...

从中提取目录信息,如果不匹配,则使工具引发错误。然后将该工具合并到您的CI服务器中,并使用msbuild日志文件进行反馈。 原始答案 尝试在命令行上使用/ p:BuildProjectReferences = false 。顾名思义,它将禁用引用项目的构建。在构建solution1时,这应该不是问题,因为projectA将作为解决方案的一部分构建。但是,在构建solution2时,它不会构建projectA,您将收到构建错误。

我们已经检查了这个msbuild选项。然而,这不是我们想要的。实际上,我们希望在解决方案内保留项目引用分辨率,而不包括涉及构建顺序的解决方法。例如,一个包含两个项目(按此顺序)ClassLibrary1和ClassLibrary2的解决方案,如果ClassLibrary1引用ClassLibrary2,则使用/p:BuildProjectReferences=false将无法构建该解决方案。 - Benoit Patra
现在据我所知,...由解决方案表示。你猜得对,这或多或少是我们在建立更清晰的分离之前想要防止的。我们已经在MSBuild中进行了检查,并没有发现针对这种情况的任何内容。也许我们会实现一些东西来完成这项工作...然而,VisualStudio正在引发一个警告,这意味着在Visual中有某个地方检查了这种情况,也许有一种方法可以重用它... - Benoit Patra
事实上,在VS中加载项目是使用Microsoft.Build.Evaluation命名空间中的类完成的(或类似于此,我不是很确定),因此这不是来自MsBuild的构建警告。这意味着如果您想要该警告,您将需要手动获取它。 - stijn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接