lerna的安装类似于webpack,需要全局安装作为一个命令来使用,可以选择使用npx直接使用,不过为了方便,还是全局安装方便一些。
yarn global add lerna
mkdir myLerna
cd myLerna
lerna init --independent
lerna的初始化分为fix模式以及independent模式两种,默认是fix模式,或者叫做锁定模式,项目内所有的package共用版本号。不过我认为这种情况其实很少,大部分人应该都是使用独立模式,每个package拥有自己的版本号。
cd packages
mkdir package-1
cd package-1
yarn init -y
cd ..
mkdir package-2
cd package-2
yarn init -y
这里要注意,如果你没有创建任何package,你是不能使用lerna add命令安装依赖包的,因为默认lerna会为每个package安装依赖。
在开发之前,肯定是需要先安装各种eslint、prettier、commit-lint等等规范化库的,我们为啥要把一堆package放到一个仓库?其中一个原因不就是为了直接复用一套规范文件么。
所以各种lint文件肯定是安装到项目全局的,这时如果使用lerna的安装命令:
lerna add eslint --dev
就会发现一个问题,每个package都被单独安装了eslint,这明显是不合适的,既然是同一个项目,安装多次同一个模块算个什么事?
然后我们发现,lerna有提到如果你想只安装一次,那么可以把这些依赖写到每个package的package.json中,然后回到根目录运行:
lerna bootstrap --hoist
bootstrap是learna一键为所有package安装依赖的命令,如果加上了--hoist参数,那么就是告诉lerna,把所有依赖全部安装到根目录中,然后分别在各自的文件夹中创建软连接指向对应的模块实际路径。
从解决问题的眼光来看,确实解决了重复安装的问题,不过所有模块都装到根目录混杂在一起,这让强迫症心里很不舒服,我们希望的其实是只有lint这些公共库提取出来,其他的他们自己的依赖放到他们自己的文件夹中。
在参考了Babel仓库的做法后,明白了。因为node自身在查找模块的时候有向父级目录查询的操作,所以其实软连接什么的并不需要,甚至都不需要lerna,我们直接
yarn add -D eslint
这样便直接将eslint安装到了根目录中,由于层级高,所以子目录都会受到lint规则的约束。同样,为此安装好husky等等基本库,完成仓库的初始化。(可以参考我的另一篇文章)
安装依赖包有很多种方式,虽然可以进入对应的文件夹中直接使用yarn安装,不过为了项目统一,还是推荐使用lerna的命令来安装依赖
给所有package安装某个第三方依赖:
lerna add module-A
给package-A安装第三方依赖:
lerna add module-A packages/package-A
ps:这里可以使用正则,比如官方举例的:
lerna add module-1 packages/prefix-*
package-A依赖package-B:
lerna add package-B --scope=package-A
所有package都依赖package-C:
lerna add package-C
PS. lerna处理package互相依赖时采用的是软连接的模式,所以不用担心重复安装的问题。
lerna提供了一个命令来快速新建package,避免了重复机械的操作
lerna create package-D --dependencie=["package-A","lodash"]
这样可以快速新建一个package并且申明他依赖的内部package或者外部包
lerna run xxx
按照官方说法,是为所有的package执行xxx这个script,听起来有点唬人,所以我测试了一下。
首先,这里的命令,不是指根目录的package.json里面的script,lerna根本不会去管根目录里面的script。
当你运行 lerna run xxx时,他会依次遍历每个package目录的package.json,如果有同名的script就执行,没有的就跳过,每个目录对应的xxx script执行的内容也可以完全不一样,互不干扰。
lerna exec — xxx
与run命令对应的另一个命令就是exec命令,不过不同的是exec命令接受的是bash命令而不是script名称,他会为每个package执行对应的bash操作,不会跳过
第二篇结束......
参考链接: