[ Azure DevOps ] 將 .Net Standard 函式庫發佈至 Azure Artifact Feed

.NET Standard 最初的願景是作為 .NET Framework.NET Core 的中繼層,

讓開發人員能夠基於這個抽象來開發支援上述兩種 target framework 的函式庫。

這玩意兒出來其實也挺久了,但一直到最近才碰到它。

本篇將介紹如何透過 Azure Pipeline 將 .NET Standrad Library 發布至 Azure Artifact Feed

本篇內容涵蓋:

  1. 建立專案
  2. 產出 Nuget 套件
  3. 使用 .Net Core 專案測試
  4. 新增 Azure Artifact Feed
  5. 建立 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 套件。

請注意,「Generate Nuget package on build」會導致 CI 流程 pack 指令無法執行建置。
這邊打勾只是為了方便產出 .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 poolself-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