如何将 TFS 2013 构建定义配置为在获取时覆盖?

How can I configure a TFS 2013 Build Definition to Overwrite when it does its Get?

我已经使用 TfvcTemplate.12.xaml 编写了 TFS 2013 构建定义,将其设置为在每次签入时触发并且 不清理工作区 。当构建运行时,它 修改某些源文件 在构建运行时受源代码控制。如果我随后签入在上一次签入期间在构建机器上修改过的文件的更改,我会收到以下错误:

Unable to perform the get operation because the file already exists locally
Exception Message: One or more errors occurred while performing a Get operation. (type GetException)
Exception Stack Trace:    at Microsoft.TeamFoundation.Build.Workflow.Activities.SyncWorkspaceInternal.ThrowIfErrorsOccurred.Execute(CodeActivityContext context)
   at System.Activities.CodeActivity.InternalExecute(ActivityInstance instance, ActivityExecutor executor, BookmarkManager bookmarkManager)
   at System.Activities.Runtime.ActivityExecutor.ExecuteActivityWorkItem.ExecuteBody(ActivityExecutor executor, BookmarkManager bookmarkManager, Location resultLocation)

当运行“从 Team Foundation 版本控制获取源”步骤时,是否可以让 TFS 执行覆盖获取=24=]?我希望我的构建定义覆盖构建代理上与源代码管理不匹配的已修改文件,并且不想将我的构建定义设置为清理工作区。

在以前版本的 TFS 中,我可以通过将以下内容添加到 TFSBuild.proj 中来实现:

<IncrementalBuild>True</IncrementalBuild>
<GetOverwrite>True</GetOverwrite>

当您编辑构建定义时,您应该会看到一个进程选项卡。在那里,通常有一个选项可以更改构建定义执行它的方式。您没有相同的覆盖问题,因为它会从正确的文件开始。如果您已有文件,它将用签入的文件替换它们。

  1. 在构建代理上创建一个 PowerShell 脚本(例如 c:\Builds\GetCodeGeneratedFiles.ps1),内容如下:

    & "c:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\TF.exe" get "$Env:TF_BUILD_SOURCESDIRECTORY\*.*" /v:"$Env:TF_BUILD_SOURCEGETVERSION" /recursive /overwrite /noprompt
    
  2. 更新构建定义,使预构建脚本路径为 PowerShell 脚本(例如 c:\Builds\GetCodeGeneratedFiles.ps1)

当构建运行时,它将获取整个工作区中的所有文件,直到排队构建指定的版本。然后,当团队构建过程中的获取步骤运行时,它不需要获取任何文件,因为它们已经存在于本地工作区中。