Lerna前戏——多package管理与npm link方案

1,336 阅读3分钟

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:将当前项目中的库文件依赖移除