如何利用Github+Appveyor+Nuget打造自己的.net core開源庫


以下教程基於你有一個托管在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的支持:

http://shields.io/

通過這個網站我們可以看到各式各樣的,首先我們找到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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM