【问题标题】:How can I generate a custom build number in TeamCity and then patch it to assembly info?如何在 TeamCity 中生成自定义内部版本号,然后将其修补到程序集信息中?
【发布时间】:2014-04-09 10:24:05
【问题描述】:

我已经对这个主题进行了一些搜索,并且能够找到单独的解决方案来生成自定义版本号以及补丁程序集信息,但是我无法同时完成这两者。当使用我在搜索中找到的自定义 POWERSHELL 脚本时,我可以将内部版本号设置为我使用该脚本创建的版本号,但是此内部版本号不会修补。我在修补方面的唯一成功是使用设定的数字和计数器。但是 POWERSHELL 脚本创建的数字不会持续到 Assembly 修补程序可以使用的程度。我做错了吗?

【问题讨论】:

    标签: powershell teamcity assemblyinfo


    【解决方案1】:

    我终于用柴坦亚提供的一点逻辑解决了这个问题……但修改了:

    $ww = ([Math]::Floor([DateTime]::Now.DayOfYear/7)+1)
    
    Write-Host "##teamcity[buildNumber '%major.minor%.$ww.%build.counter%']"
    $fileLocation = Join-Path -Path "%teamcity.build.checkoutDir%" -ChildPath "\SourceDir\AssemblyInfo.cs" 
    
    $oldValue = "AssemblyFileVersion\(""(\d+)\.\d+\.\d+\.\d+""\)"
    $newValue = [string]::Concat("AssemblyFileVersion(""%major.minor%.", $ww, ".%build.counter%", """)")
    
    (get-content $fileLocation) | foreach-object {$_ -replace $oldValue, $newValue} | set-content $fileLocation
    

    【讨论】:

      【解决方案2】:

      在我们的项目中,我们使用 CommonAssemblyInfo.cs 文件解决了这个问题。基本上将其添加到您的解决方案中,从单个文件中删除 AssemblyInfo.cs 文件,当您编译所有 dll 时,将具有 CommonAssemblyInfo.cs 文件中指定的程序集信息。

      我们在编译之前首先更新这个文件。我们使用的唯一编号是来自源代码控制系统(在我们的例子中是 TFS)的变更集 ID。基本上,源代码控制变更集编号保证是唯一且高度相关的。它会准确地告诉您源代码管理中的哪个变更集生成了哪个程序集。

      基本上,我们构建配置的第一步是一个 powershell 脚本,如下所示(相应地更新 CommonAssemblyInfo.cs 的路径)

      $fileLocation = Join-Path -Path "%teamcity.build.checkoutDir%" -ChildPath "Source\CommonAssemblyInfo.cs" 
      
      $oldValue = "AssemblyVersion\(""(\d+)\.\d+\.\d+\.\d+""\)"
      $newValue = 'AssemblyVersion("$1.0.0.%build.vcs.number%")'
      
      (get-content $fileLocation) | foreach-object {$_ -replace $oldValue, $newValue} | set-content $fileLocation
      

      因此构建 setp 1,使用上述变更集编号更新您的程序集版本。第 2 步,编译您的解决方案。第 3 步到 x、测试、部署等。

      【讨论】:

      • 这段代码似乎让我非常接近。它成功地更改了程序集内部版本号,但是,最终编译的 EXE 仍然在其详细信息中显示 1.0.0.0。但是当我查看 teamcity checkout 文件夹的工作目录时,Assemblyinfo 文件已正确调整。所以这似乎是另一种不坚持的情况。
      • 为了澄清,我在编译步骤之前使用此代码。所以我不确定为什么它没有持续存在。相反,如果我使用带有系统计数器/内部版本号的 AssemblyInfo 修补程序,它似乎可以很好地完成工作。我使用该方法的唯一问题是它不允许我按照我想要的方式自定义内部版本号。
      猜你喜欢
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-03
      • 1970-01-01
      相关资源
      最近更新 更多