在构建服务器(CI服务器)上构建或重建

5

我正在使用TeamCity来构建一个.NET项目(准确地说是多个项目)。

我应该使用Rebuild目标还是Build目标?

我希望尽量缩短构建时间,同时不生成任何未更改的项目的新版本。

使用“Build”目标是安全的吗?如果先前的项目输出被删除了怎么办?如何验证我可以安全地这样做?

4个回答

7
如果您需要重建所有项目,例如为了获得一致的时间戳或版本号(虽然通常情况下,链接的AssemblyInfo.cs文件的更改也会触发构建),则应使用“rebuild”。即使以前的构建输出已经丢失,甚至在新的构建代理上进行构建时也完全安全。在这种情况下,将构建所有必要的项目。但是,如果您的sln/csproj文件中有自定义的MSBuild步骤依赖于(Re)build,则需要更加小心,但除此之外,如果您想要,请使用Build。

如果上一次构建的项目输出丢失了,而我将生成更新版本的程序集,即使没有更改源代码...这就是我试图防止的情况。 - lysergic-acid
1
那么该项目的输出将需要重新构建,Build 将会完成这个过程。如果你想避免在构建输出被删除时从旧源文件生成新文件,则必须在其他地方处理它。你不能要求 Visual Studio 或 MSBuild 构建依赖于项目 A 的项目 B,而不是已经在磁盘上具有先前的构建输出或者也构建了项目 A。它需要来自 A 的文件。 - Lasse V. Karlsen

2

在持续集成服务器上执行rebuild操作是必须的。

与您可能读到的相反,之前构建的数据泄漏到当前构建中是有可能的。这种泄漏几乎永远不是由于源代码没有编译成二进制文件,而是取决于您用来执行构建的工具,可能会有未复制到输出目录的非代码文件,或者已删除但未从其中删除的文件。

出于类似的原因,如果您可以承受执行时间成本,您也应该在构建之前始终清理源树。要么销毁它并检查干净的副本,要么恢复更改并删除任何未受源代码控制的文件。如果您每次都不这样做,则至少在“空闲时间”构建(例如,过夜或周末构建)以及您打算交付给客户或部署到生产环境(最好是到QA)的构建上这样做。


1

Build 会生成运行项目所需的所有内容,同时保留未更改的程序集。Rebuild 强制重新构建涉及到的所有程序集。除非出于特定情况(如版本号、依赖进程等),否则使用 Build 可以最大程度地减少时间消耗。


1

你应该使用 Build 命令逐步构建你的项目。这是完全安全的。


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