【问题标题】:How do I stop Visual Studio from building dependencies that have not changed?如何阻止 Visual Studio 构建未更改的依赖项?
【发布时间】:2011-08-18 19:49:01
【问题描述】:

标题相当简单。如果我点击构建按钮,它就像“全部重建”按钮。如果我有两个项目,我们称它们为 PARENT 和 CHILD,然后我对 Parent 进行更改并单击“构建”按钮。 VS 中的默认行为是重建 PARENT 和 CHILD,而它应该只重建 PARENT。

我想知道这是否是 Visual Studio 中的一个选项以及如何更改它。

谢谢。

【问题讨论】:

  • 您是否使用增量构建,并且您使用的是 XP?这种组合存在错误,例如增量构建在 XP 上无法正常工作,Visual Studio 无论如何都会构建很多额外的东西。

标签: visual-studio-2010 build dependencies


【解决方案1】:

请查看这篇文章:

http://blogs.msdn.com/b/kirillosenkov/archive/2014/08/04/how-to-investigate-rebuilding-in-visual-studio-when-nothing-has-changed.aspx

[HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\12.0\General] 
"U2DCheckVerbosity"=dword:00000001 

设置注册表项时(我必须添加它),只需使用适用于您的 Visual Studio 版本即可。例如。 14.0 == VS2015

所提供的诊断信息可以帮助您确定 msbuild 认为某些内容已过时的原因。

【讨论】:

    【解决方案2】:

    我刚刚在一个包含数百个项目的解决方案中看到了这样的情况。每当您单击“构建”时,VS 都会重新构建大部分项目,即使您在一秒钟前刚刚进行了完整构建。如果您只想构建一个项目,也会遇到同样的问题。

    原来问题是项目之间的循环依赖。 通常,如果这会导致循环,VS 不允许您创建从一个项目到另一个项目的引用。

    不过,这只涉及“项目引用”。 VS 不会阻止您添加 ../Debug/bin/OtherSubProject.dll 作为 DLL 引用。

    现在假设我们有一个包含 100 个项目的解决方案,其中大部分项目都依赖于CoreLibrary.dll。假设有人添加了从 CoreLibrary.dllProjectX.dll 的引用(忽略 ProjectX 已经依赖于 CoreLibrary 的事实)。

    如果我们现在运行构建,那么首先构建 CoreLibrary.dll,然后构建 ProjectX.dll 和所有其他项目。

    现在假设我们再次运行构建,不做任何更改。 VS 发现CoreLibrary.dll 的依赖项之一,即ProjectX.dllCoreLibrary.dll 更新,因此需要重建CoreLibrary.dll。但当然,重建核心库会强制重建所有其他项目,包括 ProjectX.dll(这将再次比 CoreLibrary.dll 更新)。

    解决此问题的方法是摆脱所有循环依赖关系,这尤其意味着您应该通过 DLL 引用引用您的其他子项目。执行此操作时的临时解决方案是转到解决方案属性 -> 配置,然后简单地禁用循环中的一个项目的构建(在上面的示例中为 CoreLibrary.dllProjectX.dll)。

    VS 可能会重建未更改的项目的另一个常见原因是:在其属性中设置了“复制到输出目录:始终”的静态文件。避免这些。

    最后,要调试所有这些并找出导致重建的原因,请转到“工具”->“选项”->“项目和解决方案”->“构建和运行”,然后为 MSBuild 启用“诊断”输出。然后在构建解决方案时在输出窗口中搜索单词“not up to date”。

    【讨论】:

      【解决方案3】:

      Alt + B,U 将构建您当前的项目。如果您不想在解决方案中构建所有项目,这是一个很好的捷径。

      【讨论】:

        【解决方案4】:

        我在使用 C++ 时也遇到过这个问题。即使我没有更改它们的源代码或头文件,依赖项目也会完全重新编译。

        我为所有相关项目关闭了“整个程序优化”。现在我的项目只有在我更改源代码时才会重建。 C++ 项目的这个选项可以在属性->配置属性->常规中找到。

        祝你好运

        【讨论】:

          【解决方案5】:

          我在一个解决方案中遇到了大约 40 个项目的类似问题。对我来说,以下设置比其他答案的危险性要小得多。

          1. 在 Visual Studio 中,从 Build 菜单打开 Configuration Manager
          2. Active solution configuration下拉菜单中选择
          3. 输入 名称(例如 调试界面)并复制设置或创建一个空配置。您应该可以安全地取消选择同时创建新的项目配置,尤其是如果您只想减少构建时间。
          4. 选择或取消选择要使用新配置构建的项目,然后关闭配置管理器。
          5. 使用Ctrl + Shift + B 或仅构建父项目来享受更短的构建时间。但是,如果您希望所有项目都重新构建,请不要忘记更改为另一个构建配置。如果您右键单击它们并选择Build,您取消选择的其他项目仍然可以构建。

          有关配置管理器的更多信息可以在 MSDN 上找到:Configuration Manager Dialog Box

          【讨论】:

          • 这并没有解决为什么 VS 明显检测到错误构建的项目。
          【解决方案6】:

          在解决方案资源管理器中右键单击解决方案,选择属性

          从配置属性 > 配置中,您可以从构建过程中排除特定项目

          从 Common Properties > Project Dependansies,您可以创建和删除项目依赖项

          希望这会有所帮助...

          缪斯扩展

          【讨论】:

          • 这不是一个正确的答案。 OP 询问,哪种方法可以防止不必要的构建。视觉检测错误变化
          【解决方案7】:

          您的问题似乎有些不一致,因此为了清楚起见,我将定义我使用的术语。

          • 构建:编译和链接应用程序/项目所需的所有内容
          • 清理:删除作为构建的一部分生成的所有文件。
          • 重建:执行 clean,然后执行 build

          我的 Visual Studio 没有“(重新)构建全部”按钮,但它有一个“(重新)构建解决方案”按钮,所以我假设您是这个意思。我还将假设您所说的rebuild PARENT and CHILD,您的意思是build PARENT and CHILD,并且它不会重新编译项目中的每个文件。

          BuildBuild Solution 选项不一样。

          • 执行 Build 将评估当前项目(及其依赖项),编译所需的任何内容。
          • 执行构建解决方案将评估解决方案中的所有项目,编译所需的任何内容。

          所以,如果您有一个包含 3 个项目的解决方案:

          1. 孩子
          2. 服务(取决于孩子)
          3. 前端

          那么,假设当前选中的项目是Service

          • 构建:将评估/编译:子和服务
          • 构建解决方案:将评估/编译:子、服务和前端

          现在,我相信 看到的是,当您在 Parent 上执行构建时,VS 在 Child 上执行构建好吧,即使它没有改变。我希望它正在评估 Child,因为它需要知道它是否发生了变化。如果不执行评估,它就无法知道,这就是为什么在你的输出窗口中你会看到它已经对 Child 项目做了一些事情。这通常相当快,但如果您有很多依赖项,它确实会加起来。

          如果您不希望 VS 在构建父级时评估您的依赖关系,那么您可以遵循一些方法,但您选择远离工具保护,因此除非您小心,否则您可能会遇到二进制不匹配等等……

          一些选项:

          • 卸载未更改的子项目(在解决方案资源管理器中单击鼠标右键并选择卸载)。这隐藏了依赖关系,因此它不会被编译)。
          • 停止让 Visual Studio 管理您的依赖项。最安全的方法是删除 Project Based 引用,而使用 Binary Based 引用(指向每个依赖项的编译输出)。但这可能是一项艰巨的任务,因为您必须自己管理项目构建。

          我建议您三思而后行,并评估节省的时间(可能有一些)是否值得冒险,因为您有时可能无法构建所需的一切,所以最终花时间追逐你的尾巴。

          【讨论】:

            猜你喜欢
            • 2021-05-20
            • 1970-01-01
            • 2016-05-18
            • 2020-08-24
            • 2012-06-19
            • 1970-01-01
            • 2011-10-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多