【问题标题】:How to configure VS to compile only changed code如何配置 VS 只编译更改的代码
【发布时间】:2011-07-21 03:31:46
【问题描述】:

我有一个非常大的解决方案,每次我尝试调试时都会编译它。
所以我知道我可以在解决方案配置中完全禁用所有项目的构建,但是有没有办法让 Visual Studion 只编译更改的代码?
我确定是这样。

谢谢你的到来。

【问题讨论】:

标签: c# visual-studio compilation


【解决方案1】:

正如 Marnix 和 Anton 已经说过的,这是 VS 通常所做的。但是,如果您的解决方案中有很多相互依赖的项目,并且您对将由所有或大多数其他项目使用的组件进行更改,则它必须再次构建其他项目以确保一切按预期工作.

更新

因此,如果即使您没有进行任何更改,它也开始重新编译,我们需要了解 VS 如何尝试找出它需要在增量构建中执行的操作。

为此,它只检查每个文件的日期时间以及是否有任何更改。如果是,则重新编译该文件及其所有依赖项(例如,stdafx.h 中的更改将导致完全重建,因为通常每个源文件都会引用这个文件)。

但这种行为也有例外。例如,即使没有进行任何更改,安装项目也将始终重新构建(因此,我通常将安装项目从构建过程中排除,仅在需要时手动启动它)。

因此,如果您只有通常支持增量构建的 C/C++、C#、VB 等项目,那么即使您不进行任何更改,也必须在两次构建之间进行更改。

这里有一些可能性:

  • 对源文件进行更改的构建前或构建后命令
    • 这可能是自动更新,将您的存储库中的修订号添加到 AssemblyInfo 文件的资源中。
    • 或复制/删除命令,对目录结构进行一些更改(我曾使用此命令删除预构建命令中的输出目录,以强制在每次构建时重新构建)。
  • 程序集版本的自动增量器
    • 也许通过使用[assembly: AssemblyVersion("1.0.*")] 或其他一些外部进程来增加内部版本号

如果上述步骤之一发生在您的所有或大部分其他项目所依赖的模块上,那么所有内容都需要重新构建。

【讨论】:

  • 对。我有创建包含在构建过​​程中的测试类的预构建命令。非常感谢。
  • 我有一个带有 Copy Always 的 DLL,更改为 Copy If Newer 返回了增量构建。
  • 如果您在像我这样的企业环境中工作,可能会对生成的代码产生依赖关系,这些代码可以在每次编译之前生成,这几乎肯定会导致它每次都重新构建。
  • Xmedeko 的解决方案也为我做到了。有点“呃”,但很容易错过。谢谢!
【解决方案2】:

如果您进行构建(而不是重新构建),Visual Studio 实际上是开箱即用的。但是,它会比其他项目更好地处理某些项目类型。例如,将始终构建设置或部署项目。

您可以卸载不需要加快构建速度的任何项目。

此外,我发现在不调试的情况下启动应用程序并在应用程序运行后附加调试器效果很好。据我所知,这可以最大限度地减少正在加载的调试符号的数量,以减少正在运行的应用程序实际使用的数量。

据我所知,MSBuild(VS 使用的构建引擎)会根据已更改的文件自动检测要重建的内容。 因此,请确保您没有任何生成的文件随每次构建而更新。例如,当您使用源代码管理元数据更新(程序集)版本时。任何更改的文件都会触发使用它的所有项目以及依赖它们的所有项目的构建。这样的设置每次都会有效地重建您的大部分应用程序。

【讨论】:

  • 如果我想调试初始化过程呢?我的问题是,即使我没有更改任何内容,它也会全部运行...我确定有一些选项,例如:运行时,调试 -> 全部重建,它必须是:运行时,调试 -> 全部构建跨度>
  • @rodnower - 我的建议不会帮助您调试应用程序初始化。我已经扩展了我的答案,希望这会有所帮助。
  • 检测引擎有缺陷。我的解决方案中有两个具有库依赖项 X 的可执行文件。如果我构建可执行项目 A 并运行它,然后构建可执行项目 B,我可以可靠地重现 VS,尝试再次构建 X,但由于文件被锁定而失败。这些是简单的类库。
【解决方案3】:

1/ 在详细模式下检查构建日志(工具 -> 选项 -> 项目和解决方案 -> 构建和运行)。

2/在可能的错误中,可能是“复制本地”模式下的dll导致问题,如果是这种情况,请转到项目引用,找到该dll并将“复制本地”值设置为false .

[我在这里找到了这些解决方案] https://oz-code.com/blog/net-c-tips/visual-studio-keeps-rebuilding-projects-no-good-reason

【讨论】:

    【解决方案4】:

    【讨论】:

    • 是的,我知道区别,但可悲的是,即使我没有更改任何内容,也会重新编译...
    • Oliver 提到的解决方案项目之间似乎有复杂的交叉引用
    【解决方案5】:

    我将添加它,因为没有人提到它 - 如果您的解决方案中有一个安装程序项目,那么每次重新构建或运行程序时都会重新构建该项目,即使没有其他项目发生更改。由于构建安装程序项目可能需要大量时间(在我的机器上大约 45 秒,对于我的中型项目),这是一个问题。

    要解决,只需进入配置管理器(右键单击解决方案-->属性-->配置属性)并在调试模式下取消选中“构建”安装程序项目。

    【讨论】:

      猜你喜欢
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-15
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多