【问题标题】:How to publish beta nuget packages out of AppVeyor如何从 AppVeyor 发布 beta nuget 包
【发布时间】:2016-03-20 07:40:15
【问题描述】:

这是我试图在 AppVeyor 中实现的行为

  1. 构建代码(使用 1.2.3.{build} 标记 AssemblyInfo)
  2. 测试代码
  3. 如果测试通过,则创建 nuget 包
  4. 如果包创建成功,发布测试包 (1.2.3-beta-{build})
  5. 还要使包在工件中可用。

理想情况下,在发布 nuget 包时,它将作为预发布版本发布。在 NuGet 中,这是通过在包版本的末尾添加字母字符来完成的。覆盖现有包也被认为是不好的做法(实际上,许多 nuget 实现不允许这样做)。

AppVeyor 在 github 外构建和测试软件方面做得很好,但我似乎无法控制 nuget 包版本。

鉴于: 具有下一个语义版本 1.2.3 的包 我希望 AppVeyor {version} 变量等于1.2.3.{build} 我希望 nuget 包版本等同于 1.2.3-beta-{build}

我尝试的第一件事是在{version} 框中使用变量。显然这是不允许的。作为{version} 的一部分,AppVeyor 似乎只对{branch}{build} 进行变量替换。这意味着我必须为语义版本维护一个单独的变量。

我遇到的下一个挑战是无法通过 UI 设置 nuget 包版本。它希望默认与 AppVeyor 构建版本相同。

我决定在测试运行后尝试使用 Powershell 创建包。这可行,但 Nuget Publish 步骤希望在创建包之前运行,并且似乎没有办法控制执行顺序。

我想我走错了路。我需要一个概念上的重置。

这是我的 appveyor.yml 处于当前(不正确)状态:

version: 0.1.0.{build}
configuration: Release
assembly_info:
  patch: true
  file: '**\AssemblyInfo.*'
  assembly_version: '{version}'
  assembly_file_version: '{version}'
  assembly_informational_version: '{version}'
environment:
  packageVersion: 0.1.0
nuget:
  account_feed: true
  project_feed: true
  disable_publish_on_pr: true
before_build:
- ps: nuget restore
build:
  verbosity: minimal
artifacts:
- path: '*.nupkg'
  name: nuget package
deploy:
- provider: NuGet
  api_key:
    secure: blahblahblah
  artifact: '*.nupkg'
  on:
    branch: master
on_success:
- ps: >-
    $releaseVersion= $env:packageVersion

    $buildNumber = $env:APPVEYOR_BUILD_NUMBER

    $betaVersion= "$releaseVersion-beta-$buildNumber"

    nuget pack Odin.nuspec -version $betaVersion

    Get-ChildItem .\*.nupkg | % { Push-AppveyorArtifact $_.FullName -FileName $_.Name }

我该如何解决这个问题?我能得到我想要的行为吗?

【问题讨论】:

    标签: nuget semantic-versioning appveyor


    【解决方案1】:

    您可以使用 PowerShell 和AppVeyor API 来控制版本号。我会尝试编写appveyor.yml 如下:

    version: 0.1.0.{build}
    
    environment:
      packageVersion: 0.1.0
    
    init:
    - ps: $env:buildVersion = "$env:packageVersion.$env:appveyor_build_number"
    - ps: $env:nugetVersion = "$env:packageVersion-beta-$env:appveyor_build_number"
    - ps: Update-AppveyorBuild -Version $env:buildVersion
    
    assembly_info:
      patch: true
      file: '**\AssemblyInfo.*'
      assembly_version: '$(buildVersion)'
      assembly_file_version: '$(buildVersion)'
      assembly_informational_version: '$(nugetVersion)'
    
    configuration: Release
    
    nuget:
      account_feed: true
      project_feed: true
      disable_publish_on_pr: true
    
    before_build:
    - nuget restore
    
    build:
      verbosity: minimal
    
    after_build:
    - nuget pack Odin.nuspec
    
    artifacts:
    - path: '*.nupkg'
    
    deploy:
    - provider: NuGet
      api_key:
        secure: blahblahblah
      artifact: '*.nupkg'
      on:
        branch: master
    

    【讨论】:

    • 我认为这很接近。但是,$env:NuGetVersion 不用于创建 nuget 包。尝试从“Odin.nuspec”构建包。替换令牌“版本”没有价值。在此处查看构建:ci.appveyor.com/project/crmckenzie/odin
    • 实际上,我现在看到了 after_build 事件。让我试试看。
    • 我不得不稍微调整一下 yml 文件,但你的回答让我完成了 95% 的工作。这是最终文件的链接:gist.github.com/crmckenzie/ad79d97eb7a24ffc025a
    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 2020-12-26
    • 2018-12-23
    • 1970-01-01
    • 2020-04-24
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    相关资源
    最近更新 更多