此页面需要javascript支持,请在浏览器中启用javascript

Lerna with git and symlink

lerna
git
symlink
阅读 

先大概介绍一下几种方式

多个git仓库

这是最传统的方式了

坏处也很明显,想复用一个组件或者一段逻辑

ctrl c+v很麻烦,会造成很多维护上的问题,难以追踪

即使用软连接,也经常要初始化同步,每次都要拉好几个版本的git仓库

git submodule

.gitmodules 来管理,git自带的一种多包管理方式

但是面对 js/node 项目时,往往会出现心有余而力不足的情况

举个例子

project

  • submodule
  • node_modules
  • index.js
// index.js
const Koa = require('koa');
const MyMidway = require('./submodule/my-midway');
const app = new Koa();
app.use(MyMidway);
app.listen(3000);

即 cjs 需要引入对应的 git 子模块的路径

这时候就有问题了,为什么另外一个仓库,我们不能像npm那样

又能对包进行安装,又能进行版本管理呢?

js的多包管理

lerna 作为一种专为node/npm设计的工具

在一定程度上解决了这个问题

Lerna

🐉 A tool for managing JavaScript projects with multiple packages.

用起来很简单

npm i -g lerna
lerna init

# package.json and lerna.json

lerna create package-1
lerna create package-2

上面其实就是初始化和创建本地包的指令

使用它的命令,我们就可以基于lerna本身创建注册本地包

比如我要在 package-2 里用 package-1里的组件

lerna add package-1 --scope=package-2

这时候 lerna会在所有 lerna.json>packages>[glob] 路径

去寻找非 private 的包,找到了,就在 package-2node_modules里建立 软连接

package-1 link过去,并且在 package-2package.json 的依赖里把版本定上

默认就是 package-1>package.json>version

这样就可以直接像npm包那样进行管理

不过也有缺点,比如这时候去 yarn upgrade,是没法运行的

因为yarn/npm默认自个去npmjs.com找包,本地包找不到会报错

这时候,我们要不用 lerna 自己的命令替代

要不就yarn add 一个一个升级

企业化最佳方案

当然对于公司来说

最佳方案还是私有化npm

打造一套 本地源-->私有源-->公共npm源/淘宝 的包安装系统

  • 本地源 基于 lerna
  • 私有源 基于 verdaccio
  • 公共npm源 基于 其他镜像或者直接npm

lerna publish 到 private npm registry(verdaccio)

这样yarn / npm i 安装升级就不会产生错误

同时大量的公共逻辑和组件都作为私有包,发布在私有源上

同时,本地调试也简单

因为开发环境,跑的所有代码都注册在本地

不需要去 node_modules 这个巨大的黑洞里面 寻找目录,设置断点啥的

直接边写边调试

当然lerna 注册包,也有 整体和独立 2种模式

lerna/packages也可以使用useWorkspaces选项,用package.json里的字段去检测字段

甚至lerna基于软连接,能够把所有子包的 node_modules 全部指向 项目根目录下的 node_modules

一些缺点

不过这玩意还是有一定的学习成本,而且在通过lerna 跑一些npm指令的时候

子进程的 stdout 没有很好的 pipe 进父进程的 process.stdout

这导致我们在使用sh/cmd的时候,针对一些过程比较长的task,比如webpack打包

终端没有啥显示,心里就比较慌

参考资料

© 2021 icebreaker 苏ICP备19002675号-2
version:1.2.2