GitLab 管理 NuGet 包

TXRock發表於2024-05-08

1 概覽

在伺服器上構建專案時,需要引用 nuget.org 之外的包,如公司內部開發的、第三方未釋出到 nuget.org 上的。怎麼辦?

GitLab 提供了 Package Registry 來解決這個問題。

2 上傳 NuGet 包到指定專案中

  1. 新建或使用一個已有專案,作為存放 NuGet 包的專案,為其他需要引用對應 NuGet 包的專案提供 Nuget 源和源上所有包的依賴。

  2. 在該專案的【倉庫】設定中,設定【部署令牌(Deploy Token)】

  3. 首先設定一個許可權為【write_package_registry】的令牌,允許對軟體包庫進行讀取、寫入和刪除訪問。定義一個合適的名稱和到期日期,到期日期不設定則預設永不過期。使用者名稱選填。記錄伺服器為令牌生成的密碼,該密碼只會在設定時出現,之後無法再次檢視。用於上傳包。

  4. 再設定一個許可權為【read_package_registry】的令牌,允許對軟體包倉庫進行只讀訪問。定義一個合適的名稱和到期日期,到期日期不設定則預設永不過期。必須填寫一個合適的使用者名稱,如 DEPLOY_READ。記錄伺服器為令牌生成的密碼,該密碼只會在設定時出現,之後無法再次檢視。用於新增源。

  5. 定位到所需上傳的 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 源

  1. 構建前,為專案所在構建環境內新增新的 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 包源

  1. %APPDATA%/NuGet/ 中找到 NuGet.Config,進行編輯。也可以在如 Visual Studio 這樣的 IDE 中找到對應的【NuGet 包管理器設定】,從而在 UI 介面選項中對配置檔案進行修改。

  2. 使用 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>
    
  3. 出於安全考慮,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

相關文章