.net core VSTS/Azure DevOps:包上的自动增量NuGet包版本

.net core VSTS/Azure DevOps:包上的自动增量NuGet包版本,.net-core,azure-devops,azure-pipelines,azure-pipelines-build-task,azure-artifacts,.net Core,Azure Devops,Azure Pipelines,Azure Pipelines Build Task,Azure Artifacts,运行.NET核心包任务时,如何使输出的NuGet包版本自动递增 例如,如果我当前的版本是1.0.0,那么下次调用Pack任务时,我希望看到1.0.1 我正在将环境构建变量与build.BuildNumber一起使用,并在此时获得输出,例如20180913-.2.0,等等。我想建立一个更传统的版本控制系统。我可能已经找到了答案。如果有人把头发扯下来,试试这个: 打包任务: 自动包版本控制:使用环境变量 环境变量:Build.BuildNumber 然后,在顶部菜单的上方,您有任务、变量、触发器

运行.NET核心包任务时,如何使输出的NuGet包版本自动递增

例如,如果我当前的版本是
1.0.0
,那么下次调用Pack任务时,我希望看到
1.0.1


我正在将环境构建变量与
build.BuildNumber
一起使用,并在此时获得输出,例如
20180913-.2.0
,等等。我想建立一个更传统的版本控制系统。

我可能已经找到了答案。如果有人把头发扯下来,试试这个:

打包任务:

  • 自动包版本控制:使用环境变量
  • 环境变量:Build.BuildNumber
然后,在顶部菜单的上方,您有任务、变量、触发器、选项,单击选项并设置:

  • 内部版本号格式:1.0$(版本:.r)
保存并排队。这将产生例如1.0.1

(如果我错了,请纠正我,或者如果这不能长期工作。)

从中,变量
Rev:.r
是每日生成修订计数。接受的“解决方案”将导致一天完成
1.0.12
的版本,然后第二天它将是
1.0.1

如果您想要一个简单的增量和唯一的semver,请使用
1.0.$(BuildID)

$(BuildID)
是构建的内部不可变计数器,因此比
$(BuildNumber)
更干净


BuildID将始终递增-无重置。 因此,在一个小碰撞之后,您最终会拥有say
1.2.123
成为
1.3.124

如果您想很好地执行这项任务,可以使用Dart或类似的工具来完成,例如用于Dart或FLIFT构建

- script: npm version $RELEASE_TYPE
其中,
$RELEASE\u TYPE
是一个变量,您可以根据构建(即:CI、PR等)设置,其值为
主版本
次版本
补丁
预发布版本

- script: npm version $RELEASE_TYPE
  condition: startsWith(variables['build.sourceBranch'], 'refs/head/release/')
  env:  
    releaseType: minor

更新:Bump Repo版本和内部版本使用(使用npm) 为了更新repo版本,我最终加入了DevDependency,它的precommit钩子在任何提交时都会触发项目版本

这种技术可以应用于其他项目类型,将它们放在子文件夹中——尽管可能会导致服务器操作系统需求的复杂性

要在生成中使用此版本,请添加此bash脚本任务,该任务将获取该版本并将其作为任务变量导出:

v=`node -p "const p = require('./package.json'); p.version;"`
echo "##vso[task.setvariable variable=packageVersion]$v"

.Net核心任务专用版本 不幸的是,没有回购协议

解决方法1:
jobs:
  - job: versionJob #reads version number from the source file
    steps:
      - powershell: |
          $fv = Get-Content versionFile
          Write-Host ("##vso[task.setvariable variable=versionFromFile;isOutput=true]$fv")
        displayName: 'version from file' 
        name: setVersionStep  


  - job: buildJob # consumes version number, calculates incremental number and set version using assemblyinfo.cs
    dependsOn: versionJob
    variables:
      versionFromFile: $[ dependencies.versionJob.outputs['setVersionStep.versionFromFile'] ] # please note that spaces required between $[ and dependencies
      buildIncrementalNumber: $[ counter(dependencies.versionJob.outputs['setVersionStep.versionFromFile'],1) ] #can't use $versionFromFile here


    steps:
      - powershell: |
          Write-Host ($env:versionFromFile)
          Write-Host ($env:versionFromFile + '.' + $env:buildIncrementalNumber)
        displayName: 'version from file output' 
解决方法2:
描述了其他几个,使用版本前缀,并自动将BuildNumber应用为版本后缀

,对我来说,在“选项”选项卡上将“版本号格式”设置为

$(date:yyyy).$(date:MMdd)$(rev:.r) 
并添加下一个生成参数:

/p:Version=1.$(Build.BuildNumber) /p:AssemblyVersion=1.$(Build.BuildNumber)

在这种情况下,我们手动管理主要版本,但次要版本和内部版本号将自动设置。很容易理解您部署了什么版本。

如果您只是想增加主要、次要或修订版本号,在变量中使用
计数器
运算符是一种简单而优雅的方法。它将自动向当前值添加一个

以下是我使用的:

variables:
  major: '1'
  minor: '0'
  revision: $[counter(variables['minor'], 1)] #this will get reset when minor gets bumped. The number after Counter is the seed number (in my case, I started at 1).
  app_version: '$(major).$(minor).$(revision)'

如果您想看到一个使用此功能的现实世界的4个工作管道,我这里有一个

这就是要走的路!你可以,这对阅读此线程的其他社区成员是有益的。我的经验是,如果你的解决方案/构建定义包含多个包,那么即使你更改了一个包,你基本上也会强制所有包都更改版本。因此,从长远来看,这将是不好的。@John,当您在解决方案级别上通过管道构建的任何给定解决方案中有n个项目时,您是如何(自动)仅对那些已更改的包源进行版本控制的?我一直对如何做到这一点非常感兴趣,而不将我的构建拼接到每个csproj的基础上。如何使用更改更新存储库?当我尝试此解决方案时,yes软件包收到新版本并发布。但是package.json中的版本标记仍然保持在1.0.0。我试图创建一个自定义命令来标记并推回回购,但到目前为止没有成功。与上面的问题相同,人们如何将其返回到他们的存储库中?开始时关于“每日”修订计数的部分是错误的(尽管公平地说,这是因为文档不是特别清晰)。在docs示例中,它是每日计数的唯一原因是日期也包含在buildnumber格式中,因此前缀会更改。如果你有1.0$(修订版:.r),那么每次它都会在1.0.x中不断增加x。对于npm,解决方案,它会提交更新版本吗?Azure中的repo bumps的问题是,你通常会在repo更改上映射触发器-否则它会以复杂的方式产生比它们解决的问题更多的问题。最有效的方法是在提交过程中有一个自动更新版本的钩子,然后让Azure read+使用此值来完成所需的不同步骤。下面有一些使用开箱即用功能的好答案,包括OP提供和接受的答案。也就是说,如果您正在使用Git并使用分支工作流,如Git Flow或Github Flow,我建议您考虑将其作为NuGet包集成到项目中,并具有相应的Azure DevOps任务。它提供了很大的灵活性,并且可以根据分支名称、标记甚至提交消息确定主要、次要和修补程序更新。这如何保持最新版本号?如果您现在运行它,您将得到1.0.1,下次运行它时,minor被硬编码为0,它应该再次得到1.0.1计数器运算符将它作为管道中的变量进行跟踪。您不需要手动更新它。如何推送版本
1.1.0
?次要版本需要增加