我們通常通過 npm 來安裝和使用開源的模塊。但是,通常我們有些私有的模塊,不想通過npm發(fā)布,但是又想在一些項(xiàng)目中共享使用,而且我們不想將公共模塊是復(fù)制到各個項(xiàng)目中來使用。而且一旦公有模塊更新,我們也不能及時更新。當(dāng)然,如果不嫌麻煩,可以用相對目錄,不過這種在開發(fā)代碼時,引用時,寫法上就要將相對目錄寫上。但是我們現(xiàn)在探討的是另一種方式——利用現(xiàn)有的git,既不用搭建私有的npm私有倉庫(npm private repository),又能滿足上面的需求,它做為一個快速解決方案, 后期是可以慢慢過渡升級到使用完整 npm 私有倉庫的解決方案的.
打造一個完整的 npm 私有倉庫, 需要服務(wù)器, 需要安裝環(huán)境。后面會有文章單獨(dú)介紹。
新建 npm 私有模塊
下面以一個實(shí)例來說明如何在 GitLab 中新建一個 npm 私有模塊, 假設(shè)我們要新建的私有模塊名為: wave-test
在 GitLab 上新建一個 project, 名字為: wave-test
對于公共模塊, 最好是放在同一個 group 下, 例如放在 wavesnows 這個 group 下. 那么以后所有公共模塊的 git 地址就可以統(tǒng)一為:
http://git.your-inc.com/{group}/{project}.git
將項(xiàng)目 clone 下來
git clone http://git.your-inc.com/wavesnows/wave-test.git
添加 package.json 配置, 注意限定 @scope
npm init --scope=wavesnows
然后提交 push 上去
到這里私有模塊就已經(jīng)發(fā)布好了, 如果有項(xiàng)目要使用, 就配置下項(xiàng)目的 dependencies 即可.
使用私有模塊
添加私有模塊的依賴
在項(xiàng)目的 package.json 中添加依賴, 例如: 依賴 @wavesnows/wave-test 這個私有模塊
"@wavesnows/wave-test": "git+http://git.your-inc.com/wavesnows/wave-test.git"
如果想固定依賴某個分支,可以加上分支的名字,比如分支branch1,
"@wavesnows/wave-test": "git+http://git.your-inc.com/wavesnows/wave-test.git#branch1"
安裝私有模塊
跟安裝開源的模塊一樣, 使用 npm install 安裝依賴即可. 私有模塊會安裝在 @scope 的子文件夾中, 例如:
node_modules/@wavesnows/wave-test
代碼中使用私有模塊
- 跟使用開源的模塊一樣, 我們只要寫對應(yīng)的包名即可. 私有模塊的包名只是帶有
@scope而已.
var wave = require('@wavesnows/wave-test');
// 另外一種引用方式
import WT from '@wavesnows/wave-test'
- 如果在使用webpack的項(xiàng)目中使用,我們還可以通過配置alias來簡化代碼中的寫法
alias: {
'wave-test': '@wavesnows/wave-test'
}
在代碼中就可以和引用其他module一樣了
var wave = require('wave-test');
// 或者
import WT from 'wave-test'
如果alias中配置了
'@': resolve('src')我們在使用帶有scope的模塊的時候,如果不配置alias,
@可能會造成沖突,這個和webpack的>ModuleAliasPlugin的實(shí)現(xiàn)有關(guān)。'@': resolve('src'), 'wave-test': resolve('node_modules/@waevsnows/wave-test'), // 或者 'wave-test': '@wavesnows/wave-test',
更新私有模塊
如果私有模塊的版本更新了, 我們使用 npm update 是無法更新私有模塊的, 只能通過
npm install @wavesnows/wave-test
這樣的方式來重新安裝一次私有模塊, 才能獲取到最新版本的私有模塊.
私有模塊的規(guī)范
-
package.json#name必須限定@scope
@scope 一般為 GitLab group 的名字, 例如 @companyfe, 那么 name 為: @wavesnows/wave-test
-
package.json#private設(shè)置為true防止你一不小心將私有模塊發(fā)布上去
{
"name": "@wavesnow/wave-test",
"version": "0.0.1",
"description": "Wave Tools",
"main": "index.js",
"private": "true",
"repository": {
"type": "git",
"url": "http://git.your-inc.com/wavesnow/wave-test.git"
},
"keywords": [
"wave",
"git",
"tool",
"javescript"
],
"author": "wavesnow",
"license": "MIT"
}
參考
you can specify private git repositories urls as a dependency in your package.json files.
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.