何时应该选择ReBuild而不是Build?

10

为了让我更清楚,我想问一下,在Visual Studio中,有哪些正确的条件可以使你的项目或解决方案重新构建,而不是构建?

如果我重新表述一下:为什么微软需要在Visual Studio中创建“重新构建所有”选项?他们的主要动机是什么?

谢谢!

2个回答

7

DRY:对于每个项目依次进行“清理+生成”。

生成不会删除之前的生成输出。重建会删除它们并重新生成(如果您在解决方案中,则一次生成一个项目:删除proj1\bin\Debug,生成proj1,删除proj2\bin\Debug...)。

我进行重建(或清理生成)的主要情况是当我需要更新解决方案中的第三方依赖项时。让我们看以下文件夹树:

    解决方案
      |__依赖项
      |__PROJ_1
         |__bin
         |__obj
         |__(代码)
      |__PROJ_2
         |__bin
         |__obj
         |__(代码)

如果我更改了依赖项中的dll并且没有进行重建,则VS(和MsBuild)仍将使用在PROJ_N\bin\Debug(或bin\Release)中的先前dll版本,因为依赖项查找顺序(请参见http://www.beefycode.com/post/Resolving-Binary-References-in-MSBuild.aspx):

  1. 来自当前项目的文件 - 由{CandidateAssemblyFiles}指示
  2. $(ReferencePath) - 引用路径属性,来自.USER文件。
  3. 引用项本身的提示路径,由{HintPathFromItem}指示。
    ...

bin文件夹中的dll在第一个查找情况中,依赖项文件夹中的dll在第二个查找情况中...

在这种情况下,我会进行一次清理(调试),一次清理(发布),然后进行生成,以消除bin文件夹中所有以前的版本。我可能有点过度了,重新构建可能已经足够了,但我不确定,因为dll位于Debug和Release文件夹中...


换句话说,Rebuild = Clean + Build - abatishchev
大多数情况下,对于单个项目来说是的。请参见https://dev59.com/m3M_5IYBdhLWcg3wvV5w。 - Benjamin Baumann
1
在你的 Microsoft.Common.Targets 文件中,你可以看到对于一个项目 Rebuild = BeforeRebuild; Clean; $(_ProjectDefaultTargets); AfterRebuild;。 - Benjamin Baumann
2
@abatishchev:当你的“源代码”所消耗的东西发生变化时,“清理”是必需的。以下是一个关于军事术语的例子:如果你是守卫基地大门的士兵,如果“密码”被更改以授权客人通过大门,你必须删除你的“旧密码”并获取“新密码”,以便你能够正确操作! - pencilCake

1
有时候事情会出错,构建就是无法正常工作。
例如,当我没有正确更新依赖库时,它们就不会被正确地复制到构建的 bin 路径中。还有其他例子,目前想不起来。
这就是我使用重新构建的时候。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接