Lerna前戏——多package管理与npm link方案
最近在学习lerna源码课程的时候解读了之前自己的一些npm link方面的困惑,就此做个简要的笔记与大家分享!
脚手架本地link流程
假如我们搭建的脚手架是包含子package的脚手架,目录结构如下:
imooc-test
index.js
imooc-test-lib
index.js
imooc-test/bin/index.js
#!/usr/bin/env node
const lib = require('imooc-test-lib')
console.log('imooc-test-zzf')
lib.print()
imooc-test-lib/bin/index.js
module.exports = {
print(){
console.log('执行print')
},
sum(a, b) {
return a + b;
},
mul(a, b) {
return a * b;
},
init({ option, param }) {
console.log('执行init流程zzzzz', option, param);
}
}
链接本地脚手架到本地全局:
cd imooc-test
npm link
则可以看到上图packagejson的第6行 imooc-test 命令注册为本地全局命令,在命令行直接执行即可,如下:
链接本地库文件(子package)
- 发布到npm后install的缺点
本地多个包并行开发时,如果不本地link,就需每次修改依赖包,都要发布到npm,其他依赖它的package都要重新install新的版本,非常繁琐
- 本地link的优点:
我们采用本地link的方式来实现一次关联即可,即使本地修改了子package的代码,主package也无需重新安装或link(因为本地link本来就是建立了主package和子pakage的软连接,修改的是同一份),方式如下:
方式一:npm install file:../imooc-test-lib
在主目录(imooc-test)下直接install
这种方式可以在packagejson中看到依赖"imooc-test-lib": "file:../imooc-test-lib" ,但是方式二的link方式是看不出来的
但是为了上线发布到npm之后能够正常使用,我们需要手动在packagejson中添加子package的依赖和版本
// 在imooc-test目录下执行
npm install file:../imooc-test-lib
则可以看到上图中imooc-test/packagejson第21行已经link成功
"imooc-test-lib": "file:../imooc-test-lib",
方式二:子package也link到全局
// 1.先将子package link 到本地全局
cd imooc-test-lib
npm link // 此时将imooc-test-lib 注册到了全局命令(命令为imooc-test-lib)
// 2.将主cli 注册link到全局
cd imooc-test
npm link imooc-test-lib // 将your-lib包关联到当前库
注意: 这种方式在packagejson中是看不出依赖了子package的
理解 npm link:
- npm link your-lib:将当前项目中 node_modules 下指定的库文件链接到 node 全局 node_modules 下的库文件
- npm link:将当前项目链接到 node 全局 node_modules 中作为一个库文件,并解析 bin 配置创建可执行文件
- 注意npm link的时候注册到本地的全局命令名称是packagejson的name和bin下面的命令,如下图:
如果是上图的话,本地可以执行的命令就有三个:imooc-test / imooc-test2 / imooc-zzf
这样就可以实现关联依赖本地依赖包,多个父子package的相互依赖调试了
发布注意
不管是方式一还是方式二,都是本地开发的时候进行管理使用的;
为了上线发布到npm之后能够正常使用,我们需要手动unlink本地关联关系,并在packagejson中添加或者修改子package的依赖和版本,并采用npm install的方式回归使用者的角度(依赖远程package),如下:
取消链接本地库文件unlink
cd your-lib-dir
npm unlink
cd your-cli-dir
link存在
npm unlink your-lib // 该操作类似npm uninstall,也会将packagejson中的依赖移除,只不过unlink操作的是本地包,
link不存在
rm -rf node_modules
npm install -S your-lib
需要注意:
如果主package 执行了 unlink,其依赖的子package就会失效
下一次主package执行link之后,需要重新link子package,即在主package下执行npm link imooc-test-lib
理解 npm unlink:
- npm unlink:将当前项目从 node 全局 node_modules 中移除
- npm unlink your-lib:将当前项目中的库文件依赖移除