gpt4 book ai didi

visual-studio-2010 - VS2010/MSBuild 4.0 构建外部项目

转载 作者:行者123 更新时间:2023-12-02 03:38:31 25 4
gpt4 key购买 nike

似乎自 VS2010 和 MSBuild 4.0 以来,VisualStudio 和 MSBuild 能够解析和构建不在解决方案中的项目引用。

让我们创建一个更具体的示例。创建一个名为 Solution1 的解决方案,其中包含一个名为 A 的 C# 项目和另一个名为 B 的项目。在项目 B 中,添加对项目 A 的引用。现在创建一个名为 Solution2 的新解决方案,然后单击“添加现有项目”并选择 Project B。在解决方案资源管理器和警告列表中可以看到警告。

诀窍在于即使“警告为错误”我们也能够构建Solution2.sln。实际上,找到了项目A并由 Visual Studio 或 MSBuild 构建。让我们通过打开 VS2010/VS2012 命令行并执行以下命令来验证这一点:

msbuild <dirPathToSolution1> Solution1.sln /t:clean **cleaning up solution1 with project A"
msbuild <dirPathToSolution1> Solution2.sln /t:build

ProjectA 是有效构建的,更糟的是:上面提到的警告甚至没有出现。使用以前版本的 Visual Studio 不会发生这种情况(我已经使用 msbuild 3.5 和 VS2008 对其进行了测试)。

但是,在我们的情况下,我们希望防止此类事情发生。事实上,我们有一个大型源存储库,其中包含多个解决方案和许多提交者。我们正在重组我们的依赖关系,最终目的是提取更小的存储库。同时,我们也不希望开发者在看不见的情况下添加隐藏的项目依赖。我们希望只允许在解决方案“内部”引用项目,而将其他依赖项留给程序集引用。

所以问题是“有没有办法阻止诸如 Solution2 之类的解决方案构建?”。理想情况下,它不应同时使用 VS2012 和 MSBuild 进行编译。但是,由于我们的持续集成,仅涉及 MSBuild 命令行的解决方案就可以了。

最佳答案

编辑 我检查了 Microsoft.Common.Targets 并且似乎没有任何方法可以实现您想要的。要么构建项目引用,要么不构建(例如,这受我原始答案的 BuildProjectReferences 标志的影响)。除非我遗漏了一些东西,否则无法根据它们所在的解决方案选择性地构建它们——这主要是因为项目引用是在项目级别设置的,而不是在解决方案级别设置的:在你的项目文件中有一个 MsBuild ItemGroup命名为 ProjectReferences 并使用它。 (实际上这是有道理的:如果您要求 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,您会遇到构建错误。

关于visual-studio-2010 - VS2010/MSBuild 4.0 构建外部项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21673129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com