乐趣区

关于less:使用LernaYarn管理Monorepo项目

平时的我的项目因为依赖包不多根本都是一个依赖应用一个仓库,但如果开发较为大型的我的项目,或者我的项目组件抽出的比拟细,这种场景下一个依赖应用一个仓库就加大了治理难度。Monorepo就是解决这样场景而产生的,像是 BabelVue3React 都是应用这样的治理形式。

Monorepo 优劣势

劣势

1、不便代码治理

依赖数据一旦多起来时,泛滥的我的项目仓库会使得批改关联性能须要在几个仓库间切换。

依赖扩散,治理上须要更多的精力,如果不足持续性治理,可能导致功能模块定义偏差。或是各个我的项目内容易存在过多功能雷同的代码,也不不便提取复用。

如果文档整顿不全,有可能呈现交接时导致仓库遗失的状况。

2、分支构建对立

因为模块数众多,各个模块的版本治理与模块分支对应也会越来越简单。

因为模块数众多,可能因为某个小模块的代码批改而未被留神到,导致不容易检测。

3、不便复用与测试

所有依赖同在一个仓库,不便复用、批改、测试。

劣势

1、不利于权限治理

因为所有代码都放在同一个仓库,不利于做权限治理,对于我的项目不相熟的人容易批改到其余中央代码。

2、仓库体积大

因为所有代码同放一个仓库,可能有时候批改一个小性能须要拉下残缺的仓库。

如果是引入长期开发者或是新人,不利于疾速上手我的项目。

Lerna、Yarn 与 Monorepo 关系

文章题目提到 YarnLerna 这是比拟支流的 Monorepo 仓库管理工具。

YarnFacebook 为了解决 NPM 应用中诸多问题而创建的包管理工具,其中自带了 workspaces 性能,能够通过配置根目录的 package.json 来实现 Monorepo 仓库治理。然而 Yarn 只解决了包治理的问题,对于包内的依赖、发版仍然麻烦,此时就须要另一个工具Lerna

Lerna就是 Babel 我的项目在包治理时发现解决依赖等诸多不便,因而产生的管理工具。

Monorepo 利用

装置

装置 lernayarn

npm i -g lerna yarn

初始化我的项目

进入目录,执行初始化命令

lerna init

能够应用 --independent 参数来创立 independent 模式的我的项目。

lerna 有两种版本号管理模式:fixedindependentfixed是默认模式,在这模式下所有包都应用 lerna.json 里的 version 字段值。independent模式是每个包应用独立的版本号。

执行后在我的项目下会多出 package.jsonlerna.json 文件和 packages 目录。

packages目录就是寄存多个我的项目的目录,在配置文件中能够批改。

package.json 能够增加一些配置,

"private": true, // 公有,主工程不会被公布
"workspaces": [ // 申明子 package 我的项目门路,yarn 会读取应用
    "packages/*"
]

lerna.json能够配置一些参数:

  • version: 版本号
  • npmClient: 应用指定的包管理器,值为yarnnpm。默认为npm
  • command.publish.ignoreChanges: 值为数组,配置疏忽变更的文件或目录
  • command.publish.message: 自定义公布新版的提交信息,参看 @lerna/version(翻译版 @lerna/version)
  • command.publish.registry: 配置公布的自定义仓库地址
  • command.bootstrap.ignore: 值为数组,lerna bootstrap命令疏忽的包
  • command.bootstrap.npmClientArgs: 值为数组,lerna bootstrap命令时,会将此变量值传递给npm install
  • command.bootstrap.scope: 值为数组,lerna bootstrap命令针对哪些包执行
  • packages: 值为数组,所有子包的门路

依赖治理

装置依赖

只有在我的项目主目录下执行

yarn install

yarn会主动读取 workspace 配置,就能主动装置、解决、软链接各个子包的依赖,对立放在根目录下。

也能够应用 lerna 的装置命令

lerna bootstrap

但可能不如 yarn 的包管理机制好用,能够看这篇文章《Lerna 的依赖治理及 hoisting 浅析》

增删依赖

主我的项目增加依赖

yarn add -W -D [packageName]

-W 是指定在我的项目根目录执行命令

删除公共依赖

yarn remove -W -D [packageName]

给所有子项目增删依赖

yarn workspaces add [packageName]
yarn workspaces remove [packageName]

给某个我的项目增删依赖

yarn workspace [packageNameA] add [packageNameB] // packageNameA 是指定装置依赖的包名,packageNameB 是公共的包名或者我的项目内的包名
yarn workspace [packageName] remove [packageName]

当我的项目依赖凌乱的时候,能够应用命令清理依赖

lerna clean

其余还有一些命令

// 如果 package.json 中设置了 "private": true 的不会展现

lerna ls // 列出仓库中包信息
lerna changed // 查看我的项目变动
lerna exec // 执行命令
yarn workspaces info // 查看我的项目内信息
构建公布

应用 lerna run 命令构建我的项目

lerna run build // 会执行子包中 build 命令构建

–stream,增加此参数会输入执行时的信息
–sort,增加此参数包与包之前有相互依赖的会先进行排序,而后按程序一个个构建
–scop [packageName],增加此参数能够指定某个包执行命令

lerna同时提供了疾速版本公布性能

lerna version

执行后会自动识别批改的包,而后批改版本号。如果以后代码有未提交的批改记录则禁止更新。

应用带 --conventional-commits 参数命令,能够反对 Git 的提交记录来自动更新版本号

lerna version --conventional-commits

具体的参数文档能够看 @lerna/version 或者 @lerna/version 翻译

之后能够用 lerna publish 公布新包

lerna publish from-git

具体的参数文档能够看 @lerna/publish 或者 @lerna/publish 翻译

退出移动版