前言
npm倉(cāng)庫(kù)管理工具的意義
為了方便代碼的共享,就需要將代碼拆分成多個(gè)包,存放在各自的npm倉(cāng)庫(kù)中。由于,各倉(cāng)庫(kù)代碼存在較大耦合性,容易出現(xiàn)各倉(cāng)庫(kù)之間修改混亂、難以跟蹤的問(wèn)題。因此,npm倉(cāng)庫(kù)管理工具出現(xiàn)了,使得代碼耦合、倉(cāng)庫(kù)獨(dú)立并存,實(shí)現(xiàn)優(yōu)化、管理javascript多包項(xiàng)目的功能
概述
javascript npm倉(cāng)庫(kù)管理工具
特點(diǎn)
- 一個(gè)git倉(cāng)庫(kù),對(duì)應(yīng)多個(gè)npm倉(cāng)庫(kù)
- 便于調(diào)試
- 清晰的依賴關(guān)系
- 減少依賴冗余
- 自動(dòng)管理版本
官網(wǎng)
安裝
yarn global add lerna
初次嘗試
創(chuàng)建git倉(cāng)庫(kù)
git init lerna-repo && cd lerna-repo
升級(jí)為lerna倉(cāng)庫(kù)
lerna init
創(chuàng)建內(nèi)部git倉(cāng)庫(kù),并關(guān)聯(lián)遠(yuǎn)程倉(cāng)庫(kù)
cd packages
mkdir pkg_1 && cd pkg_1 && yarn init -y && cd ..
mkdir pkg_2 && cd pkg_2 && yarn init -y && cd ..
package.json
lerna.json
packages/
├── pkg_1
│ └── package.json
└── pkg_2
└── package.json
pkg_2 提供API
// packages/pkg_2/index.js
const fn_hello = () => {
return 'hello lerna'
}
module.exports = fn_hello
pkg_1 調(diào)用API
// packages/pkg_1/index.js
const fn_hello = require('pkg_2')
const print_hello = () => {
const res = fn_hello()
console.log(res)
}
module.exports = print_hello
修改package.json
// packages/pkg_1/package.json
"dependencies": {
"pkg_2": "^1.0.0"
}
// packages/pkg_1/package.json
{
name: "pkg_1",
version: "1.0.0",
dependencies: {
"pkg_2": "^1.0.0"
}
}
// packages/pkg_2/package.json
{
name: "pkg_2",
version: "1.0.0"
}
鏈接模塊,引用依賴
lerna bootstrap
修改lerna.json
{
"version": "1.0.0",
"npmClient": "yarn",
"command": {
"publish": {
"registry": "npm倉(cāng)庫(kù)地址"
}
},
"packages": ["packages/*"]
}
發(fā)布到npm倉(cāng)庫(kù)
// 登錄到verdaccio提供的npm私有倉(cāng)庫(kù)
npm adduser --registry npm倉(cāng)庫(kù)地址
lerna publish
查看npm倉(cāng)庫(kù)

常用命令
// 升級(jí)為lerna倉(cāng)庫(kù)
lerna init
// lerna默認(rèn)使用的是集中版本,所有的package共用一個(gè)version
// 如果希望不同的package擁有自己的版本,可以使用independent模式
--independent
// 鏈接模塊,引用依賴
lerna bootstrap
// 導(dǎo)入指定git倉(cāng)庫(kù)的包作為lerna管理的包
lerna import <pathToRepo>
// 發(fā)布
lerna publish
// 指定版本號(hào)
--npm-tag [tagname]
// 發(fā)布嘗鮮版
--canary
// 跳過(guò)git命令
--skip-git
// 強(qiáng)制發(fā)布,不進(jìn)行修改檢查
--force-publish [packages / *]
// 列出所有分包
lerna ls
// 列出存在修改的分包
lerna changed
// 顯示分包的修改內(nèi)容
lerna diff [package]
// 運(yùn)行腳本
lerna run [script]
lerna.json參考說(shuō)明
{
"version": "1.1.3",
"npmClient": "npm",
"command": {
"publish": {
// lerna changed/publish期間,忽略的文件
"ignoreChanges": ["ignored-file", "*.md"],
// 自定義 發(fā)布提示消息
"message": "chore(release): publish",
// 倉(cāng)庫(kù)IP
"registry": "https://npm.pkg.github.com"
},
"bootstrap": {
// lerna bootstrap期間,忽略的包
"ignore": "component-*",
// lerna bootstrap期間,npm install 參數(shù)
"npmClientArgs": ["--no-package-lock"]
}
},
// 每個(gè)包的路徑
"packages": ["packages/*"]
}
相關(guān)資源
npm scripts
https://docs.npmjs.com/misc/scripts
npm scope
https://docs.npmjs.com/misc/scope
常見問(wèn)答
https://github.com/lerna/lerna/blob/master/FAQ.md
https://github.com/lerna/lerna/blob/master/doc/troubleshooting.md