自VS2010和MSBuild 4.0以来,VisualStudio和MSBuild似乎能够解析和构建不位于解决方案中的项目引用。
让我们创建一个示例以更具体地说明。创建一个名为“Solution1”的解决方案,其中包含一个名为“A”的C#项目和另一个名为“B”的项目。在“项目B”中,添加对“项目A”的引用。现在创建一个新的解决方案,并单击“添加现有项目”,然后选择“项目B”。可以在解决方案资源管理器和警告列表中看到警告。
关键是即使出现“警告作为错误”,我们仍然能够构建“Solution2.sln”。实际上,Visual Studio或MSBuild可以找到并构建“项目A”。让我们通过打开VS2010 / VS2012命令行并执行以下命令来验证这一点:
让我们创建一个示例以更具体地说明。创建一个名为“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命令行的解决方案将通过我们的持续集成工具运行。