Azure devops 如何从*.nuspec在Azure管道中仅设置主要和次要NuGet包版本?

Azure devops 如何从*.nuspec在Azure管道中仅设置主要和次要NuGet包版本?,azure-devops,nuget,yaml,azure-pipelines,nuget-package,Azure Devops,Nuget,Yaml,Azure Pipelines,Nuget Package,目前,我有这样的*.yaml变量,带有一个自动递增的计数器: variables: solution: '**/*.sln' buildPlatform: 'Any CPU' buildConfiguration: 'Release' majorVersion: '1' minorVersion: '1' patchVersion: $[counter(format('{0}.{1}', variables['majorVersion'], variables['m

目前,我有这样的*.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>
<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'])]

有可能得到我描述的行为吗


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

您可以尝试在变量组中定义版本变量。然后通过RESTAPI获取
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)"
然后通过RESTAPI更新变量组中版本变量的值。有关详细信息,请参阅此。最后使用nuget pack任务中的变量

此外,您可以查看nuget pack任务中的自动包版本控制选项是否满足您的需要

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

恐怕没有现成的方法将变量从
.nuspec
传递到
*.yaml

这是因为Azure管道无法直接解析
.nuspec
文件。因此,我们需要通过一些脚本(如powershell)简单地解析
.nuspec
文件

我们的团队以前也有类似的要求。我们将收到其他团队开发的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任务中使用来设置变量,以便我们可以在下一个任务中使用它:

$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"

这件事看起来像描述的那样有效,但对我来说确实让事情变得更复杂了。我的问题的主要目的是,是否可以从一个文件*.nuspec配置所有内容。如果仍然需要打开/执行其他内容,则可以像我刚才所做的那样更轻松地执行—在*.nuspec中编写发行说明,在*.yaml中更改次要/主要版本。