【问题标题】:How to set only major and minor NuGet package version in Azure Pipelines from *.nuspec?如何从 *.nuspec 在 Azure Pipelines 中仅设置主要和次要 NuGet 包版本?
【发布时间】:2020-12-19 18:58:52
【问题描述】:

目前,我有这样的 *.yaml 变量,带有一个带有计数器的自动增量:

 variables:
  solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'
  majorVersion: '1'  
  minorVersion: '1'
  patchVersion: $[counter(format('{0}.{1}', variables['majorVersion'], variables['minorVersion']), 0)]
  productVersion: $[format('{0}.{1}.{2}', variables['majorVersion'], variables['minorVersion'], variables['patchVersion'])]    

和 *.nuspec 这样:

<metadata>
    <id>$id$</id>
    <version>1.0.0</version> <!--just a placeholder because can't be empty-->
    <authors>$author$</authors>
    <description>some description</description>
    <releaseNotes>some release notes</releaseNotes>
</metadata>

我想要实现的是将主要和次要版本变量从 *.nuspec 传递到 *.yaml 并保持自动增量逻辑如下:

<metadata>
    <id>$id$</id>
    <version>1.0.0</version> <!--just a placeholder because can't be empty-->

    <customVar_MajorVersion>1</customVar_MajorVersion>
    <customVar_MinorVersion>1</customVar_MinorVersion>

    <authors>$author$</authors>
    <description>some description</description>
    <releaseNotes>some release notes</releaseNotes>
</metadata>

并像这样使用它们:

variables:
 solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'

  majorVersion: $(fromMyNuspec.customVar_MajorVersion) 
  minorVersion: $(fromMyNuspec.customVar_MinorVersion)

  patchVersion: $[counter(format('{0}.{1}', variables['majorVersion'], variables['minorVersion']), 0)]
  productVersion: $[format('{0}.{1}.{2}', variables['majorVersion'], variables['minorVersion'], variables['patchVersion'])]

是否有可能得到我描述的行为?

我找到的最接近的问题是this one,但没有公认的答案。

【问题讨论】:

    标签: azure-devops nuget yaml azure-pipelines nuget-package


    【解决方案1】:

    我想要实现的是将主要和次要版本变量从 *.nuspec 传递到 *.yaml

    恐怕没有这种开箱即用的方式将变量从.nuspec 传递到*.yaml

    这是因为 Azure 管道无法直接解析 .nuspec 文件。所以我们需要通过一些脚本来简单的解析.nuspec文件,比如powershell。

    我们的团队之前也有类似的要求。我们将收到其他组开发的 nuget 包的预发布版本。我们需要对包进行测试,将包的版本从预发布版更改为正式版。所以我们需要从nuspec文件中获取包版本并进行修改。

    要从 *.nuspec 获取版本,我们可以使用以下 powershell 脚本来解析它:

    $customVar_MajorVersion = ([xml](Get-Content "$(System.DefaultWorkingDirectory)\Test\MyCustom.nuspec")).package.metadata.customVar_MajorVersion
    $customVar_MinorVersion = ([xml](Get-Content "$(System.DefaultWorkingDirectory)\Test\MyCustom.nuspec")).package.metadata.customVar_MinorVersion
    
    echo "The customVar_MajorVersion is $customVar_MajorVersion"
    echo "The customVar_MinorVersion is $customVar_MinorVersion"
    

    然后如果我们想保持这些变量的自增,我们可以自增这些变量并在上面的powershell任务中使用Logging Command来设置变量,以便我们可以在下一个任务中使用它:

    $customVar_MajorVersion = ([xml](Get-Content "$(System.DefaultWorkingDirectory)\Test\MyCustom.nuspec")).package.metadata.customVar_MajorVersion
    $customVar_MinorVersion = ([xml](Get-Content "$(System.DefaultWorkingDirectory)\Test\MyCustom.nuspec")).package.metadata.customVar_MinorVersion
    
    $increment_MajorVersion= 1+"$customVar_MajorVersion"
    
    $increment_MinorVersion= 1+"$customVar_MajorVersion"
    
    Write-Host "##vso[task.setvariable variable=MajorVersion]$increment_MajorVersion"
    Write-Host "##vso[task.setvariable variable=MinorVersion]$increment_MinorVersion"
    

    【讨论】:

      【解决方案2】:

      您可以尝试在变量组中定义版本变量。然后通过Get Variable Groups By Idrest api获取patchVersion1变量的值,通过脚本自动递增值。例如:

      示例脚本:

      $token = "{PAT token}"
      $token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($token)"))
      $url1="https://dev.azure.com/{org}/{}pro/_apis/distributedtask/variablegroups?groupIds=5&api-version=6.0-preview.2"
          
      $response1 = Invoke-RestMethod -Uri $url1 -Headers @{Authorization = "Basic $token"} -Method Get 
      $rev=[int] $response1.value.variables.patchVersion1.value
      $rev++
      
      Write-Host "result = $($rev | ConvertTo-Json -Depth 100)"
      

      然后通过Variablegroups-Updaterest api更新变量组中version变量的值。详情可以参考这个case。最后使用nuget pack任务中的变量。

      另外,您可以查看 nuget pack 任务中的 Automatic package versioning 选项是否满足您的需求。

      【讨论】:

      • 这件事看起来像描述的那样工作,但对我来说确实让事情变得更加复杂。我的问题的主要目的是是否可以从一个文件 *.nuspec 配置所有内容。如果仍然需要打开/执行其他东西,那么像我一样更容易做 - 在 *.nuspec 中编写发行说明并在 *.yaml 中更改次要/主要版本。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-14
      • 2017-04-22
      • 1970-01-01
      • 2013-09-22
      • 2014-11-14
      • 1970-01-01
      • 2021-05-25
      相关资源
      最近更新 更多