.NET Standard 最初的願景是作為 .NET Framework 與 .NET Core 的中繼層,
讓開發人員能夠基於這個抽象來開發支援上述兩種 target framework 的函式庫。
這玩意兒出來其實也挺久了,但一直到最近才碰到它。
本篇將介紹如何透過 Azure Pipeline 將 .NET Standrad Library 發布至 Azure Artifact Feed。
本篇內容涵蓋:
- 建立專案
- 產出 Nuget 套件
- 使用 .Net Core 專案測試
- 新增 Azure Artifact Feed
- 建立 Azure Pipeline
建立專案
在建立 .NET Standard 的函式庫專案之前,
首先要先決定函式庫的版本。
下表可以看到 .NET Standard、.NET Framework、 .NET Core 三者之間的版號對應關係。
你可以看到 .NET Framework 在 .NET Standard 2.1 之後就不支援了,
其中的原因我猜想或許與微軟把主力都投入到未來的 .NET 5 身上了。
但目前許多第三方套件仍是以支援 .NET Standard 為主力。
( https://docs.microsoft.com/zh-tw/dotnet/standard/net-standard#net-implementation-support )
好的我們進入正題!
這邊我們選用 .NET Standard 2.0 作為函式庫版本,
在建立專案時請選擇 Class Library (.NET Standard) 。
預設會自動產生一個 Class1.cs 的類別,
為方便示範我們將其改為 MyCalculator.cs,
並實作一個簡易加法的函式。
MyCalculator.cs
public class MyCalculator
{
public int Add(int a, int b) => a + b;
}
好了之後請在專案點選右鍵開啟 Properties ( 屬性欄 ),
並確認 Target Framework 是否為 .NET Standard 2.0 。
產出 Nuget 套件
在過去 .Net Framework 的時候,
要產出一個 Nuget 套件我們必須手動撰寫 .nuspec 檔,
而在 .NET Standard 的 Library 專案中,
我們可以直接在 Package 這邊設定一些簡單的 meta 資訊,
這邊如果把 Generate Nuget package on build 打勾,
它會幫你在 .csproj 中加入一行:
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
這麼一來 VS 就會在建置的階段幫你產生 .nupkg 套件。
這邊打勾只是為了方便產出 .nupkg 檔供 .NET Core 專案測試。
請切記於上傳至 Azure DevOps Repos 之前將打勾取消(或直接去設定 .csproj 檔內的 XML 標籤也可)。
設定完成後我們來執行建置,
它會在根據組態模式在專案下的 bin 目錄下產出 MyNetStandardLib.1.0.0.nupkg,
例如:
- MyNetStandardLib\bin\Debug
- MyNetStandardLib\bin\Release
使用 .NET Core 專案測試
完成之後,我們另外開一個 .NET Core 的專案來測試,
接著並手動在 Nuget Package Manager 新增一個指向 .nupkg 產出的 Package source 並完成安裝。
然後測試一下剛才寫的方法是否有 work ,
可以從右邊輸出看到結果是正常的。
溫馨提醒:
請記得將 Generate Nuget package on build 取消勾選 後,
再將專案上傳至 Azure DevOps Repo。
新增 Azure Artifact Feed
Azure Artifact Feed 可作為私有套件的存放庫,
除了 NuGet 之外還支援了其他語言的函式庫來源 ( npm、PyPI、Maven )。
首先點選 Create Feed 來建立套件存放庫。
接著輸入 Feed 名稱並設定檢視權限及使用範圍,
這邊我們將使用範圍限定為專案內使用。
按下 Create 後即完成建立。
建立 Azure Pipeline
接著我們要來建立一條新的 Azure Pipeline ,
在官方的 Template 中並沒有 Publish to Artifact 這類的可以選,
所以新增時可以跳過直接來設定 azure-pipeline.yml 就好了。
azure-pipeline.yml
trigger:
- master
pool:
vmImage: 'windows-latest'
variables:
buildProjectName: 'MyNetStandardLib'
buildPlatform: 'Any CPU'
buildConfiguration: 'Release'
steps:
- task: DotNetCoreCLI@2
inputs:
command: 'pack'
arguments: '--configuration $(buildConfiguration)'
packagesToPack: '**/$(buildProjectName).csproj'
- task: NuGetAuthenticate@0
displayName: 'NuGet Authenticate'
- task: NuGetCommand@2
displayName: 'NuGet push'
inputs:
command: 'push'
publishVstsFeed: 'MyNetStandardLib/MyFeed'
前面是指定 build agent pool 及 self-defined variables ,
主要是設定 steps 中的 Task ,
- DotNetCoreCLI - pack:會幫我們執行專案建置並產出 .nupkg 檔,這邊一定要指定欲打包專案的路徑 ( packagesToPack )
- 這邊要注意,如果要在 pack 過程請它執行 build 的話,
- NugetAuthenticate:作 Artifact Feed 權限的驗證,請確認是否有將 Feed settings / Permissions 中 Project Collection Build Service 設定為 Contributor。
- NugetCommand:將 pack 階段產出的 .nupkg 發布至指定的 Artifact Feed 。 publishVstsFeed 參數格式會依建立 Feed 時指定的 Scope 而有所差異,如下所示:
- Project:使用範圍為該專案時,格式為 ProjectName/Feed ( ex: MyNetStandardLib/MyFeed)。
- Organization:使用範圍為整個組織時,格式直接給 Feed 名稱即可 ( ex : MyFeed)。
設定好之後按下 Save 就會開始執行 Pipeline,
免費的 CI 速度有點慢,請耐心等待。
成功之後到 Artifact 就可以看到我們剛才上傳的套件啦!
參考
https://docs.microsoft.com/zh-tw/dotnet/standard/net-standard
https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-pack