【问题标题】:VSTS - Version NuGet using AssemblyInfo and appending build numberVSTS - 使用 AssemblyInfo 并附加内部版本号的版本 NuGet
【发布时间】:2025-12-06 19:15:01
【问题描述】:

我正在尝试在 VSTS 上为我的 NuGet 包设置 CI 部署,以便在进行新提交时,打包一个包并将其发送到我的提要。不幸的是,我不知道从哪里开始;我在版本控制方面的大部分经验都是手动更新解决方案中的文件,因此提出了这个问题,所以如果有更好的方法可以让我知道。

我希望名称是 AssemblyInfo.cs 文件中的版本号(“0.0.1”),并附加自动构建的构建号。所以最终结果看起来像“0.0.1.35”。我也想避免在我的命名中使用日期/时间;很多建议都是使用它,但我真的希望保持版本号干净,以便我可以发布包。

我正在使用“NuGet 包”任务,所以我只有“使用日期时间”、“使用环境变量”或“使用内部版本号”选项。

  1. 日期/时间意味着我必须手动输入我希望自动输入的主要、次要和补丁。

  2. 环境变量,听起来可能是这样,但我想我错过了我应该在这个字段中输入的内容。

  3. 我将构建名称设置为“$(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)”,但没有得到我希望的结果。李>

任何帮助将不胜感激!

【问题讨论】:

    标签: nuget azure-devops


    【解决方案1】:

    您是否希望文件版本与 NuGet 包版本匹配?如果是这样,您可以使用以下解决方案。

    默认情况下,NuGet pack 命令将使用文件版本作为包版本。要使用此功能获得所需的预期输出,您需要在构建期间更新文件版本。这可以通过 VSTS 市场中的 Update Assembly Info 任务轻松完成。还有许多其他类似的任务,但这个任务只允许您修改文件版本的修订部分,独立于主要、次要和构建版本。

    1. 将更新程序集信息任务添加到您的 VSTS 帐户
    2. 修改您的构建定义并将“更新程序集信息”任务添加到构建中。确保它在您的 Visual Studio 构建或 MSBuild 任务之前,因为您需要在构建发生之前更改程序集信息
    3. 在更新装配任务中设置值以匹配装配所需的值。默认情况下,它将 Revision 设置为 $(Build.BuildId),这是您根据您的要求所需要的
    4. 在 Nuget Pack 任务中关闭“自动包版本控制” 将“更新程序集信息”任务添加到您的构建过程中,并确保它在您的 Visual Studio 或 MSBuild 任务之前。

    您的构建现在应该创建一个 0.0.1 的 Nugetpackage。{Build.BuildId}

    注意:这是使用版本 2.* 的 NuGet 任务和版本 2.* 的更新程序集信息任务进行测试的。

    【讨论】:

    • 感谢您的解决方案,它很酷,但是如何在使用 .nuspec 文件时使其工作,
    • 为了清楚起见,您想使用更新程序集信息任务,但不是对项目文件使用 NuGet 包,而是对 nuspec 文件使用它?
    【解决方案2】:

    简单的工作流程是使用环境变量:

    1. 为构建定义添加新变量(例如 packageVersion)
    2. 在 AssemblyInfo.cs 中添加 PowerShell 任务以获取版本(您可以参考使用 PowerShell script to customize your build process 中的代码)
    3. 通过调用Write-Host "##vso[task.setvariable variable= packageVersion;]xxx" (Logging Commands) 更新 PowerShell 脚本中的变量值(步骤 2)
    4. 添加 NuGet 包任务(自动包版本控制:Use an environment variable;环境变量:packageVersion

    【讨论】:

      【解决方案3】:

      我为此编写了这个 PowerShell 脚本:

      param 
      ( 
          [parameter()][string] $FolderPath, 
          [parameter()][string] $FileExtension 
      )
      $RegularExpression = [regex] 'AssemblyInformationalVersionAttribute\(\"(.*)\"\)'
      $path = Get-Location
      
      # Get the files from folder that ends in $FileExtension content
      $assemblyInfoFile = (Get-ChildItem -Path $FolderPath -Force -Recurse -File -Include *$FileExtension).Name
      
      # Get the Content of the file and store it in the  variable 
      $fileContent = Get-Content $FolderPath/$assemblyInfoFile
      
      foreach($content in $fileContent)
      {
          $match = [System.Text.RegularExpressions.Regex]::Match($content, $RegularExpression)
          if($match.Success) {
              $version = $match.groups[1].value
          }
      }
      
      # Check if variable has content
      if ($version)
      {
          Write-Host $version
          Write-Host ##vso[task.setvariable variable=packageversion]$version
      }
      

      在本地运行脚本:

      .\powershellScriptName.ps1 -FolderPath "c:\Git\" -FileExtension "AssemblyInfo.cs"
      

      FolderPath:输出构建解决方案的路径
      FileExtension:我们要搜索版本的名称的一部分

      VSTS 步骤:

      1. 构建任务以构建解决方案并将de输出目录保存在变量中;

      2. 添加 PowerShell 任务以使用 FolderPath 和 FileExtension 作为参数调用您的脚本;

      3. 最后,packageversion应该有正确的版本

      ** 项目技术:.netcore

      【讨论】: