c# - 如何找出 TFS 2015 构建中的变更集是从哪里构建的?

标签 c# tfs tfs-2015

我只分发由我的 TFS 构建定义之一构建的二进制文件,每个构建都会收到一个唯一的版本号 (1.0.$yy$dayofyear.$rev)。构建名称的名称包含此版本号。版本号由 PowerShell 脚本设置为二进制文件的程序集版本和文件版本。我只有 60 天的构建结果保留期(包括我的放置文件夹中的构建二进制文件),现在我想知道:我怎么可能找出某个一年前的版本号是从哪个变更集构建的,以便我可以查看源代码或完全重建二进制文件吗?我是否必须在构建过程中以某种方式显式添加变更集信息?我是否必须在构建期间设置的版本号中对变更集编号进行编码?这两个想法看起来都不是很巧妙。

最佳答案

我终于想出了一个 PowerShell 脚本,我将其挂接到我的构建定义中,作为一个额外的构建步骤,紧接在与建议的步骤类似的步骤之后 here在所有 AssemblyInfo.cs 文件中设置版本属性:

$systDefinitionId = $env:SYSTEM_DEFINITIONID
$buildDefVersion = $env:BUILD_DEFINITIONVERSION
$buildDefName = $env:BUILD_DEFINITIONNAME
$buildSourceVersion = $env:BUILD_SOURCEVERSION
$buildSourceBranch = $env:BUILD_SOURCEBRANCH

$SrcPath = $env:BUILD_SOURCESDIRECTORY
$AllVersionFiles = Get-ChildItem $SrcPath AssemblyInfo.cs -recurse
$AllVersionFilesCount = ($AllVersionFiles | Measure-Object).Count

Write-Verbose "Updating $AllVersionFilesCount AssemblyInfo.cs files in path ""$SrcPath"" with source information."  -Verbose

Write-Verbose "ID of build definition:      $systDefinitionId" -Verbose
Write-Verbose "Version of build definition: $buildDefVersion" -Verbose
Write-Verbose "Name of build definition:    $buildDefName" -Verbose
Write-Verbose "Changeset to build:          $buildSourceVersion" -Verbose
Write-Verbose "Branch to build from:        $buildSourceBranch" -Verbose

foreach ($file in $AllVersionFiles)
{
(Get-Content $file.FullName) |
    %{$_ -replace 'AssemblyProduct\(""\)', "AssemblyProduct(""$buildDefName / $buildSourceVersion"")" } |
    %{$_ -replace 'AssemblySourceBranch\(""\)', "AssemblySourceBranch(@""$buildSourceBranch"")" } |
    %{$_ -replace 'AssemblySourceChangeset\(0\)', "AssemblySourceChangeset($buildSourceVersion)" } |
    %{$_ -replace 'AssemblyBuild\(""\)', "AssemblyBuild(@""$buildDefName / ID: $systDefinitionId / Version: $buildDefVersion"")" } |
Set-Content $file.FullName -Force
}

我正在通过写入构建定义名称和用于创建二进制文件的变更集来修改 AssemblyProduct 属性。稍后,此信息会在 Windows 资源管理器的详细信息选项卡上显示在 exe 或 dll 的属性中。

此外,我还定义了自定义属性 AssemblySourceBranchAssemblySourceChangesetAssemblyBuild 来携带更多详细信息。它们都具有相同的结构,因此为简洁起见,仅提供 AssemblySourceChangeset 的源代码:

[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false)]
public class AssemblySourceChangesetAttribute : Attribute
{
  public AssemblySourceChangesetAttribute(uint changeset)
  {
    Changeset = changeset;
  }

  public uint Changeset { get; }
}

如果“公开”可见产品字段中的信息不足以重建二进制文件,仍然可以反射(reflect)出 exe 或 dll 并读取那些在源分支上具有信息的自定义属性, id 和存储的构建定义的版本。

关于c# - 如何找出 TFS 2015 构建中的变更集是从哪里构建的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43147361/

相关文章:

c# - 为面试/测试做准备的关于 C++/STL/C#/J2SE 的最佳和最短书籍

c# - C++ CLI gcnew 未声明的标识符

c# - EF需要时间来执行SP

tfs - 团队基础服务器 2010 : How to enable reports?

build - TFS 2015 中 Visual Studio 2017 的 VSTest 配置

git - 没有写入数据 : Not enough storage - Git on TFS 2015

c# - 占位符文本框 Windows Phone 8

Git-tfs 获取和比较

visual-studio-2010 - TFS 合并如何工作?

asp.net-mvc - TFS 2015 CI - 具有 Web、控制台和 WCF 项目的解决方案中不会为控制台应用程序生成构建工件