1 概覽
在伺服器上構建專案時,需要引用 nuget.org 之外的包,如公司內部開發的、第三方未釋出到 nuget.org 上的。怎麼辦?
GitLab 提供了 Package Registry 來解決這個問題。
2 上傳 NuGet 包到指定專案中
-
新建或使用一個已有專案,作為存放 NuGet 包的專案,為其他需要引用對應 NuGet 包的專案提供 Nuget 源和源上所有包的依賴。
-
在該專案的【倉庫】設定中,設定【部署令牌(Deploy Token)】
-
首先設定一個許可權為【write_package_registry】的令牌,允許對軟體包庫進行讀取、寫入和刪除訪問。定義一個合適的名稱和到期日期,到期日期不設定則預設永不過期。使用者名稱選填。記錄伺服器為令牌生成的密碼,該密碼只會在設定時出現,之後無法再次檢視。用於上傳包。
-
再設定一個許可權為【read_package_registry】的令牌,允許對軟體包倉庫進行只讀訪問。定義一個合適的名稱和到期日期,到期日期不設定則預設永不過期。必須填寫一個合適的使用者名稱,如 DEPLOY_READ。記錄伺服器為令牌生成的密碼,該密碼只會在設定時出現,之後無法再次檢視。用於新增源。
-
定位到所需上傳的 Nuget 包,如在本地磁碟目錄下,執行命令:
dotnet nuget push <待上傳的Nuget包> --source https://gitlab.example.com/api/v4/projects/<your_project_id>/packages/nuget/index.json --api-key <write_package_registry的令牌密碼>
api-key 還可以是個人訪問令牌或者流水線作業令牌,該指令需要 GitLab v16.1 以上的支援
3 新增 GitLab 上的 NuGet 源
-
構建前,為專案所在構建環境內新增新的 NuGet 源,執行命令:
dotnet nuget add source "https://gitlab.example.com/api/v4/projects/<專案ID>/packages/nuget/index.json" --name <源名稱> --username <read_package_registry的令牌使用者名稱> --password <read_package_registry的令牌密碼>
源名稱可以是任意合適的名稱,如
gitlab-software-group-projects
4 管理 NuGet 包源
-
在
%APPDATA%/NuGet/
中找到NuGet.Config
,進行編輯。也可以在如 Visual Studio 這樣的 IDE 中找到對應的【NuGet 包管理器設定】,從而在 UI 介面選項中對配置檔案進行修改。 -
使用 CLI 新增過 NuGet 源,可以在配置檔案中
packageSources
檢視到。<packageSources> <add key="nuget.org" value="https://www.nuget.org/api/v2/" /> <add key="Microsoft Visual Studio Offline Packages" value="C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\" /> <add key="gitlab-software-group-projects" value="https://gitlab.example.com/api/v4/projects/<專案ID>/packages/nuget/index.json" /> </packageSources>
-
出於安全考慮,NuGet 現要求對程式包進行包源對映,告知機器某個程式包應該訪問哪個包源進行下載,避免不法分子利用同名的程式包連結到未知的地址。配置檔案中編輯
packageSourceMapping
來進行包源對映設定。<packageSourceMapping> <packageSource key="nuget.org"> <package pattern="*" /> </packageSource> <packageSource key="gitlab-software-group-projects"> <package pattern="A.*" /> <package pattern="B.*" /> </packageSource> </packageSourceMapping>
5 參考資料
- NuGet packages in the Package Registry