使用 Gitlab package registry 發布與下載私人 npm 套件全記錄
前情提要:
近期在幫公司開發一個提供內部前端成員使用的 npm package。在開發的過程中有一個比較麻煩的點是,我過去從來沒有開發過 npm package 的經驗,對於如何設置開發環境、打包、發布、維護可說是完全從零開始研究。再加上公司不希望這個 package 開源給外部使用,也沒有計劃要付費使用 npm Orgs 的私人 npm 功能。因此,除了研究如何開發 npm package 之外,同時還得研究是否有免費且適合我們公司的私人 npm library 的解決方案。
問題
我研究了公司至今為止發布 npm library 的作法,發現公司至今為止所有共用函式庫的開發與發布流程大致如下:
- 開發端:
修改原始碼 → 在本機打包 → 將原始碼與打包後的檔案一併推到 gitlab 上 → 根據改動程度決定是否需要上 tag。
- 用戶端:
在本地專案中手動指定 package.json 中套件的專案路徑與版本 -> 把整個函式庫專案從 gitlab 上 clone 到本地端的 node_module
我覺得目前這樣的開發與發布流程隱藏了一些問題:
- 使用端下載套件時,會將原始碼以及其他靜態檔案一同下載下來,造成 node_module 體積過大。
- 供使用端下載的打包檔案沒有錨定於套件版號。
- 發布流程(打包、更新版號、撰寫 CHANGELOG)全手動,不易維護且容易產生疏漏,比如更新版號時忘記打包最新版本的程式碼
總結上述問題中,我認為核心癥結在於:供使用端下載的打包文件應該與原始碼分開託管。
一般來說,我們使用 npm install 指令下載的套件都是託管在公開的 npm registry 中。然而,免費方案下的 npm registry 只能託管開源的套件,這無法滿足公司想要的私人 npm 需求。
經過一番搜尋後,我發現 Gitlab 提供了一個非常方便的解決方案: Gitlab Package Registry
,它可以像 npm registry 一樣運作,但同時保留了私人託管的特性。經過嘗試,我發現這個工具非常強大且易於使用。本篇文章將記錄如何將私人用的 npm library 發布到 Gitlab,以及如何從 Gitlab 下載 npm library。
Gitlab package registry 簡介
Package Registry 是什麼?
首先,我們來談談 package registry 到底是什麼。簡單來說,package registry 是一個可以儲存和管理軟體套件的地方。我們可以把它想像成一個專門放軟體套件的倉庫,讓開發者們可以方便地分享和重複使用這些程式碼與模組。
Gitlab Package Registry
是 Gitlab 提供的一個功能,讓我們可以在 Gitlab 的平台上管理自己的 npm packages。如此不僅可以把程式碼放在 Gitlab 上,還可以把 npm 套件一同託管於 Gitlab,這對於在使用 Gitlab 的公司或私人開發團隊來說非常方便。
Gitlab 如何作為 npm package 的容器?
在介紹如何發布 library 到 Gitlab 之前,讓我們來看看 Gitlab 如何作為 npm package 的容器。
首先,每個 Gitlab 專案(project)都有自己的 Package Registry,也就是說,每個 Gitlab 專案都擁有自己獨立的 npm packages 存儲空間用來存儲和管理多個 npm packages。而每個專案的 Package Registry 都有一個類似地址的唯一 URL,這個 URL 通常是以專案 ID 為基礎構建的。比如說,我在範例中建立的專案 ID 是 123,那麼 Package Registry URL 可能看起來像這樣:
https://<your_domain_name>/api/v4/projects/123/packages/npm/
這個 URL 主要是用來告訴 npm 使用者從哪裡下載或上傳套件。