Featured image of post 如何設定 GitLab Private NPM Registry?多套件與權限管理的最佳實踐

如何設定 GitLab Private NPM Registry?多套件與權限管理的最佳實踐

解決 GitLab Private NPM Registry 設定難題,包含 .npmrc 邏輯、多 套件管理與 404 錯誤排解,並提供統一 Registry 的最佳實踐方案。

你是因為公司專案需要使用私有套件(Private Package),結果卡在 .npmrc 的設定上嗎?

為什麼明明設定了 Token,卻還是出現 404 Not Found?

當公司有多個團隊、多個套件(例如 @frontend@backend)時,該如何優雅地管理 .npmrc

破解 .npmrc 的兩大迷思

要搞懂 .npmrc,得先明白它是怎麼運作的。

簡單來說,它的核心邏輯只有兩件事:Scope 映射身分驗證

1. Scope 映射(Scope Mapping)

這是在告訴 npm:當你看到以 @company 開頭的套件時,不要去官方的 npmjs.org 找,要去我們指定的 GitLab Registry 找。

@company:registry=https://gitlab.com/api/v4/groups/100/-/packages/npm/

2. 身分驗證(Authentication)

有了地址,你還需要鑰匙。鑰匙就是你的 AuthToken。

這裡有個超級關鍵的規則:Registry URL 與 AuthToken 的路徑必須「完全匹配」

# ✅ 正確:路徑跟上面定義的 registry 完全一樣
//gitlab.com/api/v4/groups/100/-/packages/npm/:_authToken=${GITLAB_TOKEN}

# ❌ 錯誤:路徑不匹配,這會導致權限失敗
//gitlab.com/api/v4/:_authToken=${GITLAB_TOKEN}

很多人設定失敗,往往就是因為路徑多了一個斜線或少了一個層級。

依賴地獄與 404 錯誤

最讓人頭痛的情況是:你安裝 A 套件,結果它依賴了 B 套件(也是私有的),然後 npm 噴出一個 404 Not Found

為什麼會這樣呢?那是因為 npm 在解析依賴時,如果沒有正確的對應關係,它會迷路。

特別是當你有兩個不同的 Scope(例如 @team-a@team-b)分別在不同的 GitLab Group 時,.npmrc 會變得異常複雜且難以維護。再加上不同 Registry 可能需要不同的 Token,光是管理這些環境變數就飽了。

那有沒有更聰明的做法?

推薦方案:統一下載 Group Registry & 獨立的發布 Project Registry

Registry 說明
Group Registry 為了能夠統一下載所有套件,統一設定 Group Registry 去進行下載這個 Gitlab Group 底下的所有套件。
Project Registry 為了發佈的時候有權限,所以每個專案可以設定自己的 Project Registry 去進行發佈。

為什麼要這樣做?

原因 說明
安裝簡單 可以方便的安裝下載同一個群組的所有套件。
發佈簡單 可以方便的發佈套件到各自的專案,避免不同的套件發佈到同一個 Registry,每個專案有自己的 Registry。
Token 管理容易 不論是在開發者電腦還是 CI/CD 環境,都只需要維護一組 GITLAB_NPM_TOKEN
避免依賴報錯 所有私有套件都在同一個地方,npm 絕對不會找不到人。

設定實戰

你可以直接複製這份範本:

記得把保護 Token 的工作交給環境變數,絕對不要直接把 Token 寫死在程式碼裡!

# .npmrc
# @company scope 使用 group 層級的 registry
# 所有 @company/* 套件都會從此 registry 安裝
@company:registry=https://gitlab.com/api/v4/groups/YOUR_GROUP_ID/-/packages/npm/

# GitLab npm registry 認證設定
# 使用通用的 gitlab.com auth token (覆蓋所有 group 和 project 層級的請求)
//gitlab.com/api/v4/groups/YOUR_GROUP_ID/-/packages/npm/:_authToken=${GITLAB_NPM_TOKEN}
# 使用專案的 registry 去發佈套件
//gitlab.com/api/v4/projects/YOUR_PROJECT_ID/packages/npm/:_authToken=${GITLAB_NPM_TOKEN}


# 其他公開套件還是走官方庫
registry=https://registry.npmjs.org/

package.json 中設定 publishConfig,將套件發佈到對應的 GitLab Project Registry。

{
  "name": "@company/my-package",
  "publishConfig": {
    "@company:registry": "https://gitlab.com/api/v4/projects/YOUR_PROJECT_ID/packages/npm/"
  }
}

結論

透過 「統一下載 Group Registry」「獨立的發布 Project Registry」 的策略,我們可以大幅降低維護成本,讓開發流程更順暢。

目標 說明
精準比對 Scope 映射與 Token 路徑要完全一致
安全第一 善用環境變數 ${GITLAB_NPM_TOKEN} 管理隱私資訊
集中管理 優先使用統一的 GitLab Group 來下載公司所有私有套件
獨立發佈 優先使用獨立的 GitLab Project 來發佈各自的私有套件,獨立管理各自的套件避免混亂

掌握了這些邏輯,GitLab NPM Registry 就是你公司開發流程中強大的幫手了!

All rights reserved,未經允許不得隨意轉載
使用 Hugo 建立
主題 StackJimmy 設計