2015-12-14 41 views
4

这里是我想在AppVeyor如何发布测试版的NuGet包在AppVeyor

  1. 构建代码(邮票集信息与1.2.3.{build}
  2. 测试代码
  3. 创建实现行为nuget包如果测试通过
  4. 如果包成功创建,发布测试包(1.2.3-beta-{build}
  5. 也使包在工件中可用。

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

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

考虑: 一个包与1.2.3 下一版本的语义我期望的AppVeyor {}版本变量等同于1.2.3.{build} 我期望的NuGet包版本等同于1.2.3-beta-{build}

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

我遇到的下一个挑战是无法通过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 } 

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

回答

6

您可以使用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 
+0

这是我想的。但是,$ env:NuGetVersion不用于创建nuget包。 试图从“Odin.nuspec”构建包。替换令牌“版本”没有任何价值。 请参阅https://ci.appveyor.com/project/crmckenzie/odin –

+0

实际上,我现在在那里看到after_build事件。让我尝试一下。 –

+2

我不得不稍微调整yml文件,但你的答案让我有95%的方式。 以下是最终文件的链接:https://gist.github.com/crmckenzie/ad79d97eb7a24ffc025a –