以下教程基於你有一個托管在Github上的.net core項目,如果沒有的可以自己fork一個或者自己創建了默認的項目即可。
我們打開需要生成nuget包的項目中的project.json文件,有關nuget中相關的配置是可以直接通過packOptions節去配置的,比如下面這樣:
1 "packOptions": { 2 "iconUrl": "https://avatars0.githubusercontent.com/u/16951448?v=3&s=70", 3 "projectUrl": "https://github.com/Vip56/Sino.FileManager", 4 "licenseUrl": "https://github.com/Vip56/Sino.FileManager/blob/master/LICENSE" 5 }
配置了在nuget中顯示的圖片(“iconUrl”),項目地址(“projectUrl”)和版權信息(“licenseUrl”),當然還有其他配置節,大家可以自行摸索。
通過上面的配置,保證了我們最終生成nuget包中對應的信息,但是appveyor默認情況下不能非常好的支持.net core的項目,所以我們需要借助PowerSheel腳本去自己構建項目,我們先在項目根目錄下新建一個名為Build.ps1的文件,然后在該文件中輸入以下內容:
1 function EnsurePsbuildInstalled{ 2 [cmdletbinding()] 3 param( 4 [string]$psbuildInstallUri = 'https://raw.githubusercontent.com/ligershark/psbuild/master/src/GetPSBuild.ps1' 5 ) 6 process{ 7 if(-not (Get-Command "Invoke-MsBuild" -errorAction SilentlyContinue)){ 8 'Installing psbuild from [{0}]' -f $psbuildInstallUri | Write-Verbose 9 (new-object Net.WebClient).DownloadString($psbuildInstallUri) | iex 10 } 11 else{ 12 'psbuild already loaded, skipping download' | Write-Verbose 13 } 14 15 # make sure it's loaded and throw if not 16 if(-not (Get-Command "Invoke-MsBuild" -errorAction SilentlyContinue)){ 17 throw ('Unable to install/load psbuild from [{0}]' -f $psbuildInstallUri) 18 } 19 } 20 } 21 22 function Exec 23 { 24 [CmdletBinding()] 25 param( 26 [Parameter(Position=0,Mandatory=1)][scriptblock]$cmd, 27 [Parameter(Position=1,Mandatory=0)][string]$errorMessage = ($msgs.error_bad_command -f $cmd) 28 ) 29 & $cmd 30 if ($lastexitcode -ne 0) { 31 throw ("Exec: " + $errorMessage) 32 } 33 } 34 35 if(Test-Path .\artifacts) { Remove-Item .\artifacts -Force -Recurse } 36 37 EnsurePsbuildInstalled 38 39 exec { & dotnet restore } 40 41 Invoke-MSBuild 42 43 $revision = @{ $true = $env:APPVEYOR_BUILD_NUMBER; $false = 1 }[$env:APPVEYOR_BUILD_NUMBER -ne $NULL]; 44 $revision = [convert]::ToInt32($revision, 10) 45 46 #exec { & dotnet test .\test\Sino.WilddogClient.Tests -c Release } 47 48 exec { & dotnet pack .\src\Sino.WilddogClient -c Release -o .\artifacts --version-suffix=$revision }
最后的部分的:
#exec { & dotnet test .\test\Sino.WilddogClient.Tests -c Release } exec { & dotnet pack .\src\Sino.WilddogClient -c Release -o .\artifacts --version-suffix=$revision }
中的測試被我注釋掉了,如果讀者需要可以將前面的#去掉,然后修改后面的項目名稱即可,而最后一行就是生成指定項目的nuget包,這里也需要讀者根據自己的實際情況去修改項目的路徑,這樣構建部分的指令就完成了。
既然我們的CI使用的是AppVeyor為什么我們還需要自己去寫這個腳本,這樣自動構建不是一無是處了嗎,其實不然,我們僅僅只是手動了Build部分的操作,剩下其他的還是需要借助CI去完成了,所以我們還需要在根目錄下新建appveyor.yml文件,這樣appveyor會按照我們這個配置文件去構建項目,其中的內容如下:
1 version: '{build}' 2 branches: 3 only: 4 - master 5 build_script: 6 - ps: .\Build.ps1 7 test: off 8 artifacts: 9 - path: .\artifacts\**\*.nupkg 10 name: NuGet 11 deploy: 12 - provider: NuGet 13 name: production 14 api_key: 15 secure: 【加密后的apikey】 16 skip_symbols: true 17 on: 18 branch: master
可以看到這部分的腳本很簡單,只是告訴CI,我們只構建master分支的提交和PR,並且使用該項目根目錄下的Build.ps作為構建的指令,且還單獨設置了nuget包輸出的文件夾,artifacts,最后我們配置Nuget將master構建生成的nuget包上傳到nuget.org官方庫中,僅僅到這里基本足夠大部分的使用了,如果需要更diy的可以去查看官方的文檔,這里還有一個需要提醒的就是其中secure是我們nuget的apikey,這個數據屬於機密內容,但是作為開源項目,肯定是會暴露的,幸好appveyor提供了加密措施,可以讓我們把加密后的字符串放入其中,這樣就安全多了。
首先我們登錄我們的nuget.org賬戶,找到如下圖所示部分的Key:

有了這個原始的Key之后,我們進入這個網站:https://ci.appveyor.com/tools/encrypt
將我們的Key加密,然后將加密后的字符串放到上文中的“【加密后的apikey】”。這樣AppVeyor的配置就結束了。最后大家都能看到很多開源的項目都有很多的標簽,比如當前構建是否通過,是否支持Nuget安裝等等,下面我們就來美化我們的ReadMe.md文檔。首先是構建狀態,這個直接打開我們Appveyor然后找到如下菜單就可以看到對應的MarkDown格式的:

對於下面這種,是有專門的網站提供了各類svg的支持:
通過這個網站我們可以看到各式各樣的,首先我們找到nuget形式的,然后點擊后面的路徑:

會彈出如下的對話框:

其中最重要的就是Link參數,我們需要將我們這個庫的nuget地址復制到其中,下面就會生成對應的Markdow格式的字符串,剩下我們就是把這些Markdown復制到ReadMe.md中即可,這樣一個完整的開源項目就完成了。
如果大家出現nuget無法上傳,顯示版本號不符合要求的,可能需要大家修改version如下:
1.0.0-release-*或者1.0.0-beta-*
實在不懂的可以參考如下幾個開源項目:
https://github.com/Vip56/Sino.FileManager
https://github.com/Vip56/Sino.WilddogClient
