基於 git 打造簡易的 npm 私有倉庫

空白_丶發表於2018-04-25

版權歸作者所有,任何形式轉載請聯絡作者。 作者:U_U(來自豆瓣) 來源:https://www.douban.com/note/617409014/

做過 Node.js 開發的同學, 我們都知道通過 npm 來安裝和使用開源的模組.

但如果是公司內部的私有模組呢? 如何將模組在公司內部公共出來, 又如何釋出, 如何安裝, 在多個專案中投入使用呢? 我們總不能將這些模組都 npm publish 上去公諸於眾吧. 而且你肯定也不想公共模組是複製到各個專案中來使用的吧, 如果那樣的話, 當公共模組有更新的時候, 我們豈不是要通知各個專案重新覆蓋一份? 突然覺得心好累啊. ┭┮﹏┭┮

因此為了讓我們可以在公司內部安裝和使用私有模組, 我們需要打造一個 npm 私有倉庫(npm private repository)來集中存放公司的私有模組, 要使用這些私有模組的專案只需要新增依賴安裝即可.

但如果要打造一個完整的 npm 私有倉庫, 需要伺服器, 需要安裝環境. 但其實首先第一步我們只是想簡簡單單地在公司內部共享些私有模組, 那麼 npm+git 足以. 當然這個方案是有弊端的, 但這並不妨礙它做為我們初期的一個快速解決方案, 後期是可以慢慢過渡升級到使用完整 npm 私有倉庫的解決方案的.

新建 npm 私有模組

下面以一個例項來說明如何在 GitLab 中新建一個 npm 私有模組, 假設我們要新建的私有模組名為: hello-private

  • 在 GitLab 上新建一個 project, 名字為: hello-private

    對於公共模組, 最好是放在同一個 group 下, 例如放在 companyfe 這個 group 下. 那麼以後所有公共模組的 git 地址就可以統一為: http://git.your-inc.com/{group}/{project}.git

  • 將專案 clone 下來

git clone http://git.your-inc.com/companyfe/hello-private.git

  • 新增 package.json 配置, 注意限定 @scope

npm init --scope=companyfe

  • 然後提交 push 上去

到這裡私有模組就已經發布好了, 如果有專案要使用, 就配置下專案的 dependencies 即可.

使用私有模組

  • 新增私有模組的依賴

    在專案的 package.json 中新增依賴, 例如: 依賴 @companyfe/hello-private 這個私有模組

    複製程式碼

"@companyfe/hello-private": "git+http://git.your-inc.com/companyfe/hello-private.git"


* 安裝私有模組

跟安裝開源的模組一樣, 使用 `npm install` 安裝依賴即可. 私有模組會安裝在 `@scope` 的子資料夾中, 例如: `node_modules/@companyfe/hello-private`.

* 使用私有模組

跟使用開源的模組一樣, 我們只要寫對應的包名即可. 私有模組的包名只是帶有 `@scope` 而已.

```javascript
var hello = require('@companyfe/hello-private');
複製程式碼
  • 更新私有模組

    如果私有模組的版本更新了, 由於 npm+git 方案的弊端, 我們使用 npm update 是無法更新私有模組的, 只能通過 npm install @companyfe/hello-private 這樣的方式來重新安裝一次私有模組, 才能獲取到最新版本的私有模組.

注意: 私有模組的規範

  • package.json#name 必須限定 @scope

@scope 一般為 GitLab group 的名字, 例如 @companyfe, 那麼 name 為: @companyfe/hello-private

  • package.json#private 設定為 true

    防止你一不小心將私有模組 publish 上去就麻煩了

弊端

npm + git (I mean, using git+ssh:// dependencies) - most people seem to use this, but it's a terrible idea... npm update doesn't work, can't use git subdirectories this way, etc.

參考

you can specify private git repositories urls as a dependency in your package.json files.

Private npm modules

All private packages are scoped. If a package's name begins with @, then it is a scoped package. The scope is everything in between the @ and the slash.

When used in package names, scopes are preceded by an @ symbol and followed by a slash. Scopes are a way of grouping related packages together.

The commit-ish can be any tag, sha, or branch which can be supplied as an argument to git checkout. The default is master.

相關文章