防止 msdeploy 在 TFS 构建后同步未更改的文件?

Posted

技术标签:

【中文标题】防止 msdeploy 在 TFS 构建后同步未更改的文件?【英文标题】:Prevent msdeploy from syncing unchanged files after TFS Build? 【发布时间】:2014-12-28 07:16:32 【问题描述】:

从 TFS 执行 get-latest 时,所有时间戳都设置为执行 get 操作的时间。在运行 msdeploy 以执行同步时,源中的时间戳与目标服务器上的时间戳进行比较。当然,这意味着使用 TFS + msdeploy,每个文件都会在每次构建后推送到目标服务器,除非

您使用增量构建 构建控制器的池中只有一个构建代理。

如果构建定义设置为进行干净构建,或者如果您想使用多个构建代理,那么这将不再有效。

这个话题一直都在出现,每隔几年我就会换行一次,以防万一发生了变化。这可以通过几种不同的方式解决:

TFS 将工作区文件的时间戳设置为上次签入时间。 TFS 将工作区文件上的时间戳设置为文件本身上次签入时的上次修改时间。 msdeploy 使用一些基于内容的比较方法(例如 MD5)来比较文件,而不是时间戳比较。 还有别的吗?

我不知道去哪里搜索这些东西,因为这两个团队都非常不透明——尤其是 webdeploy 团队。这个问题已经解决了吗?

【问题讨论】:

【参考方案1】:

TFS 和 Visual Studio 团队完全透明,您可以通过http://visualstudio.uservoice.com 提交功能请求,通过http://connect.microsoft.com 提交错误。

但是,服务器工作区中的所有文件都设置为文件最后在服务器上修改的日期。本地工作空间对文件内容进行物理比较以确定更改。您可以在工作区属性中从本地工作区更改为服务器工作区。

【讨论】:

MrHinsh!我喜欢你的博客。我们的团队项目集合被配置为默认为服务器工作区,所以我假设构建代理正在创建其中之一;但是,我需要深入研究构建过程模板才能确定。但是,即使是这种情况,我对根本原因的假设也一定是不正确的,因为我们的 msdeploy 同步仍在将每个文件推送到目标服务器。 我查看了我们的构建过程模板和 MSDN 文档,似乎 CreateWorkspace 构建活动不允许指定 FileTime 参数。但是,由于工作空间是在每次构建时创建的,我们不能简单地更改现有工作空间的属性,因为它们不会存在很长时间。你知道如何使用 CheckIn FileTime 模式创建工作区吗?【参考方案2】:

最后,我们编写了一个 powershell 脚本来包装由 Web 发布管道生成的 .cmd 文件,并在调用 .cmd 脚本的命令中传递 -useChecksum 标志来解决这个问题。由于 WPP 创建的样板文件 .cmd 允许向 msdeploy 传递额外的参数,因此我们能够通过如下所示的行来完成此操作。

& "MyProject.cmd" /u:agent /p:P@ssw0rd /m:$ComputerName /y -useChecksum

这样,即使 TFS 正在创建时间戳设置为最新时间的工作区,msdeploy 现在也被指示使用校验和。

【讨论】:

以上是关于防止 msdeploy 在 TFS 构建后同步未更改的文件?的主要内容,如果未能解决你的问题,请参考以下文章

MSDeploy 抛出奇怪的错误:xxxxx.dll 的流数据尚不可用

MSDeploy 没有在目的地更新正确的路径

使用 msdeploy 转换文件

HOWTO:在还原后修复不同步的 TFS 工作区

在线构建 TFS 后如何访问工件文件夹?

PITR 后 recovery.conf 未更改为 recovery.done