【发布时间】:2012-08-09 16:55:05
【问题描述】:
我正在设置 TeamCity(从 CruiseControl.NET 迁移),我正在努力让它通过 MSBuild 执行增量构建。
我有一个小的 .proj 文件,其中包含一个基本构建脚本,用于使用从 TeamCity 输入的一些参数来调用我的解决方案的构建。当我手动调用脚本时,MSBuild 的 Incremental Build 功能会启动并在后续运行时完全跳过构建。
通过 Team City 调用此脚本时,构建日志每次都会显示干净编译的输出。我在构建过程中观察了工作目录,可以看到之前构建的输出没有消失。
我还通过远程连接到服务器并从命令提示符运行 MSBuild,从该目录手动调用了构建脚本。以这种方式运行它会在第一次调用后触发预期的增量构建。
即使从仪表板开始构建而不进行任何更改,也会发生完整的重建。
我无法确定原因,但似乎有些东西给 MSBuild 的印象是它正在获得新的更改并导致它在每次运行时都执行重建。我在 TeamCity 文档中看不到太多可以解释这一点的内容 - 我的期望是,如果源代码控制系统没有更改,它就不会更新工作文件夹。
TeamCity 是否将某些参数传递给触发重建的构建过程?我可以查看这些参数吗?
检查了详细的 MSBuild 日志(/v:d 命令行开关)后,发生完全重建的原因是文件 .NETFramework,Version=v4.0.AssemblyAttributes.cs 在每次构建时都在 <Agent>\temp\buildTmp 目录中更新。
此文件通常位于%TMP%\.NETFramework,Version=v4.0.AssemblyAttributes.cs; TeamCity 正在更改本地临时目录环境变量以引用代理的临时文件夹。不幸的是,这个文件是由构建过程的Microsoft.Common.targets 部分在不存在时创建的。在每次构建之前删除“temp”文件会导致每次构建都会创建它,并在每个项目文件的构建中动态引用。
我需要找到一种方法来防止在每次构建时重新创建此文件。
【问题讨论】: