【问题标题】:VS2010/MSBuild 4.0 building external projectsVS2010/MSBuild 4.0 构建外部项目
【发布时间】:2014-03-07 13:02:46
【问题描述】:

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

让我们创建一个更具体的示例。创建一个名为 Solution1 的解决方案,其中包含一个名为 A 的 C# 项目和另一个名为 B 的项目。在 project B 中,添加对 project 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 命令行的解决方案就可以解决。

【问题讨论】:

标签: visual-studio-2010 visual-studio visual-studio-2012 build msbuild


【解决方案1】:

edit 我检查了 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。顾名思义,它将禁用引用项目的构建。在构建解决方案 1 时,这应该不是问题,因为无论如何都会像在解决方案中一样构建 projectA。但是在构建 solution2 时,它不会构建 projectA,并且会出现构建错误。

【讨论】:

  • 我们已经检查了这个 msbuild 选项。然而,这不是我们想要的。实际上,我们希望将项目引用解析保留在解决方案中,不包括涉及构建订单的解决方法。例如,具有两个项目(按此顺序)ClassLibrary1 和 ClassLibrary2 的解决方案,那么如果 ClassLibrary1 引用 ClassLibrary2,则解决方案将不会使用 /p:BuildProjectReferences=false 构建。
  • 现在据我了解,...由解决方案表示。您猜对了,这或多或少是我们在设置更清洁的分离之前想要阻止的。我们在 MSBuild 中也进行了检查,并没有发现这种情况。也许我们会实现一些东西来完成这项工作......但是,VisualStudio 发出警告,这意味着在 Visual 中的某个地方检查这种情况也许有一种方法可以重用它......
  • 事情是,在 VS 中加载项目是使用 Microsoft.Build.Evaluation 命名空间中的类完成的(或类似的东西,不知道),所以它不是构建警告来自 MsBuild。这意味着如果你想要那个警告,你必须自己手动获取它..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
  • 2014-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多