如何阻止Visual Studio构建未更改的依赖项?

时间:2011-05-04 19:19:19

标签: visual-studio-2010 build dependencies

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

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

感谢。

7 个答案:

答案 0 :(得分:5)

你的问题似乎有些不一致,所以为了清楚起见,我将定义我正在使用的术语。

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

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

Build Build Solution 选项不一样。

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

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

  1. 服务(取决于儿童)
  2. 前端
  3. 然后,假设当前选择的项目是服务

    • 构建:评估/编译:Child&服务
    • 构建解决方案:评估/编译:Child,Service&前端

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

    如果您不希望VS在构建父项时评估您的依赖项,那么您可以遵循一些方法,但是您选择退出工具保护,所以除非您小心,否则可能会出现二进制不匹配等...

    一些选项:

    • 卸载您未更改的子项目(右键单击解决方案资源管理器并选择卸载)。这隐藏了依赖性,因此它不会被编译)。
    • 停止让visual studio管理您的依赖项。最安全的方法是删除基于项目的引用,而不是使用基于二进制的引用(指向每个依赖项的编译输出)。但这可能是一项非常重要的工作,因为您必须自己管理项目构建。

    我建议你再三考虑一下你在问什么,并评估是否节省时间(可能有一些)是值得冒险的,你可能不会再建立所需的一切,所以最终花时间追逐你的尾巴。

答案 1 :(得分:5)

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

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

来自公共属性>您可以创建项目Dependansies并删除项目依赖项

希望这会有所帮助......

Muse扩展

答案 2 :(得分:4)

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

  1. 在Visual Studio中,从构建菜单中打开配置管理器
  2. Active solution configuration 下拉列表中选择< New ...>
  3. 输入名称(例如调试接口)并复制设置或创建空配置。您应该可以安全地取消选择同时创建新的项目配置,特别是如果您只想减少构建时间。
  4. 选择或取消选择要使用新配置构建的项目,然后关闭Configuration Manager。
  5. 使用Ctrl + Shift + B或仅构建父项目,享受更短的构建时间。但是,如果您希望再次构建所有项目,请不要忘记更改为其他构建配置。如果您右键单击它们并选择构建,则仍可以构建已取消选择的其他项目。
  6. 有关Configuration Manager的更多信息,请访问MSDN:Configuration Manager Dialog Box

答案 3 :(得分:3)

请查看此文章:

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 \微软\ VisualStudio的\ 12.0 \一般] “U2DCheckVerbosity”= dword:00000001

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

所呈现的诊断可以帮助您确定msbuild认为事情已经过时的原因。

答案 4 :(得分:2)

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

答案 5 :(得分:1)

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

我为所有依赖项目关闭了“整个程序优化”。现在,如果我更改源代码,我的项目只会重建。可以在Properties-> Configuration Properties-> General。

中找到C ++项目的此选项

祝你好运

答案 6 :(得分:0)

我刚刚在一个包含几百个项目的解决方案中看到了类似的情况。每当你点击" build"时,VS就会去重建大部分项目,即使你刚刚完成了一个完整的版本。如果您只想构建一个项目,也会遇到同样的问题。

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

然而,这只涉及"项目参考"。 VS不会阻止您添加,例如../Debug/bin/OtherSubProject.dll作为DLL参考。

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

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

现在假设我们再次运行构建,而不更改任何内容。 VS发现CoreLibrary.dll的一个依赖项,即ProjectX.dll 较新而不是CoreLibrary.dll,因此需要重建CoreLibrary.dll。但是,当然,重建核心库迫使重建所有其他项目,包括ProjectX.dll(这将再次比CoreLibrary.dll更新。)

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

另一个常见原因是VS可能会重建未更改的项目:静态文件带有"复制到输出目录:始终"在他们的属性中设置。避免那些。

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