Lerna 中文教程详解
About
Lerna是一个工具,它优化了应用git和npm治理多包存储库的工作流。
vue,babel,react等都在用。我司也在用。文档是英文,我便简略总结一篇,心愿对大家有帮忙。
工作的两种模式
Fixed/Locked mode (default)
vue,babel都是用这种,在publish
的时候,会在lerna.json
文件外面"version": "0.1.5",
,根据这个号,进行减少,只抉择一次,其余有改变的包自动更新版本号。
Independent mode
lerna init --independent`初始化我的项目。 `lerna.json`文件外面`"version": "independent",
每次publish
时,您都将失去一个提示符,提醒每个已更改的包,以指定是补丁、主要更改、次要更改还是自定义更改。
Start init
npm install lerna -g mkdir lerna-gp && cd $_ npm lerna init # 用的默认的固定模式,vue babel等都是这个 # Add packages cd packages mkdir daybyday gpnode gpwebpack ... #别离进入三个目录初始化成包 cd daybyday npm init -y cd ../gpnode npm init -y cd ../gpwebpack npm init -y
我的项目构造
➜ lerna-gp git:(master) ✗ tree.├── lerna.json├── package.json└── packages ├── daybyday │ └── package.json ├── gpnode │ └── package.json └── gpwebpack └── package.json
Set up
Set up git + npm
✗ git remote add origin git@gitlab.yourSite.com:gaopo/lerna-gp.git#查看是否登录✗ npm whoamixiao2280#没有则登录 npm login # 输出username password Logged in as gp0320 on https://registry.npmjs.org/. # succeed
Set up yarn的workspaces模式
默认是npm, 而且每个子package都有本人的node_modules
,通过这样设置后,只有顶层有一个node_modules
- 批改顶层
package.json and lerna.json
# package.json 文件退出 "private": true, "workspaces": [ "packages/*" ],# lerna.json 文件退出"useWorkspaces": true,"npmClient": "yarn",
Lerna Script
lerna create <name> [loc]
创立一个包,name包名,loc 地位可选
Examples
# 根目录的package.json "workspaces": [ "packages/*", "packages/@gp0320/*" ], # 创立一个包gpnote默认放在 workspaces[0]所指地位lerna create gpnote # 创立一个包gpnote指定放在 packages/@gp0320文件夹下,留神必须在workspaces先写入packages/@gp0320,看下面lerna create gpnote packages/@gp0320
lerna add <package>[@version] [--dev] [--exact]
减少本地或者近程package
做为以后我的项目packages
外面的依赖
--dev
devDependencies 代替dependencies
--exact
装置精确版本,就是装置的包版本后面不带^
, Eg:"^2.20.0" ➜ "2.20.0"
Examples
# Adds the module-1 package to the packages in the 'prefix-' prefixed folderslerna add module-1 packages/prefix-*# Install module-1 to module-2lerna add module-1 --scope=module-2# Install module-1 to module-2 in devDependencieslerna add module-1 --scope=module-2 --dev# Install module-1 in all modules except module-1lerna add module-1# Install babel-core in all moduleslerna add babel-core
lerna bootstrap
默认是npm i,因为咱们指定过yarn,so,run yarn install,会把所有包的依赖装置到根node_modules
.
lerna list
列出所有的包,如果与你文夹外面的不符,进入那个包运行yarn init -y
解决
➜ lerna-gp git:(master) ✗ lerna listlerna notice cli v3.14.1daybydaygpnodegpnotegpwebpacklerna success found 4 packages
lerna import <path-to-external-repository>
导入本地曾经存在的包
lerna run
lerna run < script > -- [..args] # 运行所有包外面的有这个script的命令$ lerna run --scope my-component test
lerna exec
运行任意命令在每个包
$ lerna exec -- < command > [..args] # runs the command in all packages$ lerna exec -- rm -rf ./node_modules$ lerna exec -- protractor conf.jslerna exec --scope my-component -- ls -la
lerna link
我的项目包建设软链,相似npm link
lerna clean
删除所有包的node_modules目录
lerna changed
列出下次发版lerna publish
要更新的包。
原理:
须要先git add,git commit 提交。
而后外部会运行git diff --name-only v版本号
,收集改变的包,就是下次要公布的。并不是网上人说的所有包都是同一个版全公布。
➜ lerna-repo git:(master) ✗ lerna changed info cli using local version of lernalerna notice cli v3.14.1lerna info Looking for changed packages since v0.1.4daybyday #只改过这一个 那下次publish将只上传这一个lerna success found 1 package ready to publish
lerna publish
会打tag,上传git,上传npm。
如果你的包名是带scope的例如:"name": "@gp0320/gpwebpack",
那须要在packages.json增加
"publishConfig": { "access": "public" },
lerna publish lerna info current version 0.1.4#这句意思是查找从v0.1.4到当初改变过的包lerna info Looking for changed packages since v0.1.4 ? Select a new version (currently 0.1.4) Patch (0.1.5)Changes: - daybyday: 0.1.3 => 0.1.5 #只改变过一个...Successfully published: - daybyday@0.1.5lerna success published 1 package