如何将TFS 2013生成定义配置为在其获取时覆盖?

如何将TFS 2013生成定义配置为在其获取时覆盖?,tfs,tfsbuild,Tfs,Tfsbuild,我已经使用TfvcTemplate.12.xaml编写了TFS 2013构建定义,将其设置为在每次签入时触发,并设置为不清理工作区。当生成运行时,它会在生成运行时修改源代码管理下的某些源文件。如果我随后签入在上一次签入期间在生成计算机上修改的文件的更改,则会出现以下错误: Unable to perform the get operation because the file already exists locally Exception Message: One or more errors

我已经使用
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版本控制的GET源”步骤时,是否可以使用TFS进行重写?我希望生成定义覆盖生成代理上与源代码管理不匹配的已修改文件,并且不希望将生成定义设置为清理工作区

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

<IncrementalBuild>True</IncrementalBuild>
<GetOverwrite>True</GetOverwrite>
True
真的

编辑生成定义时,应该会看到一个流程选项卡。在那里,通常有一个选项来更改构建定义执行它的get的方式。您没有相同的覆盖问题,因为它将首先获得正确的文件。如果已经存在文件,它将用签入的文件替换这些文件

  • 在生成代理上创建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
    
  • 更新生成定义,使预生成脚本路径为PowerShell脚本(例如c:\Builds\GetCodeGeneratedFiles.ps1)


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

    作为构建的一部分签入不是一个好做法?您能解释一下必要性吗?生成正在编译磁盘上的一些旧源文件之前对其进行预处理。TfvcTemplate.12.xaml在执行Get时,在“进程”选项卡中没有设置覆盖的选项(如tf.exe/Overwrite)。该进程没有替换源代码管理下的文件,这些文件已被上一个生成更改且可写,而是出现错误“无法执行get操作,因为该文件已在本地存在”