2015-12-14 75 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 –