業界主流的私有npm倉庫搭建的主流方案有如下幾種:
1、付費購買
2、使用 git+ssh 這種方式直接引用到 GitHub 項目地址
3、使用Verdaccio
4、使用cnpmjs.org
第一種,一是考慮到公司可能不會提供經費,二npm在國內訪問很慢,就是花錢也買不到好的體驗。
第二種,不能更新即npm update,不能使用semver(語義化版本規范)。
那么較好的選擇就只剩下第三種和第四種。
下面將分別使用基于Verdaccio和基于cnpmjs.org這兩種方案來搭建私有npm倉庫并進行總結。
1. Verdaccio方案篇
1.1 服務端部署
安裝:npm install -g verdaccio
啟動:verdaccio
warn? --- config file - C:\Users\Administrator\.config\sinopia\config.yaml
warn? --- http address - http://localhost:4873/
此時訪問localhost:4873,可獲取html文件并且服務端響應正常,表示安裝成功。
配置
運行verdaccio,自動生成的工作目錄如下(通過第一個warn可以看到具體路徑):
C:\Users\Administrator\.config\sinopia\config.yaml
|-- config.yaml //存放所有配置信息
|-- htpasswd? ? ? ? //存放所有賬戶信息
|-- storage? ? ? ? //存放私有npm包及緩存公有包
? ? ?|-- npm_test
config.yaml默認配置
storage:?F:\verdaccio\storage?//npm包存放的路徑
auth:
? ? htpasswd:
? ? ? ? ? file: ./htpasswd //保存用戶的賬號密碼等信息
uplinks:
? ? npmjs:
? ? ? ? ? url: https://registry.npmjs.org/?//拉取公共包的地址源,默認為npm的官網,可以使用淘寶的npm鏡像地址
packages: //配置權限管理
??'@*/*':? ??
? ? ? access:?$all? ??
? ? ?publish:?$authenticated
'*':
access:?$all
? ?publish:?$authenticated
? ?proxy:?npmjs
logs:
-?{type:?stdout,?format:?pretty,?level:?http}
listen:?0.0.0.0:4873? ?// 設置可以同域名訪問
i18n:
??web:?zh-CN? // 設置管理界面默認中文
1.2 客戶端配置
配置npm registry(建議客戶端使用nrm 進行npm registry地址管理和切換)
npm install -g nrm //?安裝
nrm add verdaccio??http://192.168.xx.xx:4873? //?添加verdaccio倉庫地址
nrm use verdaccio //?切換私有倉庫
nrm ls //?查看所有倉庫地址(星標為當前倉庫源)
1.3 發包
切換到私有倉庫之后,發包的操作跟npm發包基本無差別。
npm login
npm whoami
npm publish
注: 版本號重復的情況再次發布的包不會主動更新,并且發布不會有錯誤提示,更新包務必更新版本號。發布成功后私有倉庫站點會顯示包情況,README.md文件會作為詳情描述展開。
2.cnpmjs.org方案篇
2.1 服務端部署
官方依賴如下圖:
安裝:cnpmjs.org
npm i -g cnpmjs.org
cnpmjs.org默認安裝路徑:D:\Program Files\nodejs\node_global\node_modules\cnpmjs.org
修改 :默認安裝路徑\config\index.js
/* * server configure //服務器配置 */?
registryPort: 7001, //倉庫訪問端口(執行發布安裝)
?webPort: 7002, //展示查詢站點訪問端口?
bindingHost: '', //監聽綁定的 Host,默認127.0.0.1,外網訪問注釋掉此項即可
?/** * database config //數據庫相關設置 */?
database: {
????db: 'cnpmjs_test', //數據庫名稱?
????username: 'root', //數據庫訪問賬號?
????password: '', //數據庫訪問密碼?
????dialect: 'sqlite', //使用數據庫,默認sqlite
????host: '127.0.0.1', //數據庫訪問IP,通常127.0.0.1
????port: 3306, //數據庫訪問端口,通常3306
// 模塊文件存儲,默認將發布的私有模塊跟緩存公共模塊存儲在本地文件系統中,路徑~/.cnpmjs.org/nfs ,也就是模塊文件都存儲在這個目錄下;或者可以選擇三方儲存方式比如七牛等,著這里配置插件;也支持接口開發擴展儲存;
nfs: require('fs-cnpm')({
?????dir: path.join(dataDir, 'nfs')
}),
// registry url name //模塊注冊列表訪問域名,默認r.cnpmjs.org,安裝模塊時會到這個域名下查找,這個默認設置略坑,建議沒有外網域名的先清空回頭再配
registryHost: '',
// default system admins //默認管理員賬號
admins: {
admin: 'admin@cnpmjs.org',
},
/* * registry mode config 私有模塊發布相關配置*/
//是否開啟私有模式,默認為 false; 私有模式下只有管理員能發布模塊,其他賬號只有同步權限 ;非私有模式,注冊用戶都可以發布模塊
enablePrivate: false,
//若為非私有模式發布則此項必填,非管理員發布模塊式命名必須以scopes字段開頭,模塊命名示例“@cnpm/packagename”
scopes: [ '@cnpm', '@cnpmtest', '@cnpm-test' ],
// 私有模塊非scopes白名單,各種非以scope方式發布的老模塊的白名單管理,數組形式維護
privatePackages: [],
//npm官方registry地址,不會直接從這個地址同步模塊,但有時會從這里獲取模塊信息,除非必要請勿更改
officialNpmRegistry: 'https://registry.npmjs.com',
officialNpmReplicate: 'https://replicate.npmjs.com',
//同步模塊上游registry地址
sourceNpmRegistry: 'https://registry.npm.taobao.org',
/上游registry是否是cnpm,默認true,若要使用npm官方地址作為同步上游,請設置為false
sourceNpmRegistryIsCNpm: true,
//若安裝時模塊不存在,是否向源registry進行同步,默認true
syncByInstall: true,
// 同步模式選項 : none: 不進行同步,只管理用戶上傳的私有模塊,公共模塊直接從上游獲取 ; exist: 只同步已經存在于數據庫的模塊 ; all: 定時同步所有源registry的模塊
syncModel: 'exist', // 'none', 'all', 'exist'
// 同步時間間隔,默認10分鐘
syncInterval: '10m',
// 是否同步模塊中devDependencies,默認false
syncDevDependencies: false,
//用戶賬號系統接入,可以擴展接入公司的賬號系統
userService: null,
數據庫準備
? ? 安裝:npm install -g split3
? ? 初始表格:執行?默認安裝路徑\models\init_script.js
啟服務
npm install -g pm2 // 進程管理器
pm2 start dispatch(默認安裝路徑\dispatch.js)
pm2 stop id
pm2 delete id
訪問對應的IP加訪問端口即可看到,展示站點如下圖
圖7 start之后示意圖
我們可以搜索我們想要的包,如果沒有可以選擇sync進行同步。
圖8 選擇同步
選擇同步之后,后有如下同步過程
圖9 同步過程
2.2 客戶端配置
nrm add??localCnpm 192.xxx.x.x:7001
2.3 發布私有模塊
同上
如果你是一個想要擁有私人npm倉庫的個人開發者或者小團隊,Sinopia完全可以滿足需求;如果想要對私人npm服務做更多個性化定制方案,那么cnpm的擴展性支持更加友好。