如何利用lerna管理模块

栏目: CSS · 发布时间: 5年前

内容简介:当前端项目变得越来越大的时候,我们通常会将公共代码拆分出来,成为一个个独立的npm包进行维护。但是这样一来,各种包之间的依赖管理就十分让人头疼。为了解决这种问题,我们可以将不同的npm包项目都放在同一个项目来管理。这样的项目开发策略也称作根据官网上的定义,Lerna是一个利用 它能够自动帮助我们管理各种模块包之间的版本依赖关系。目前,已经有很多公共库都使用Lerna作为它们的模块依赖管理工具了,如:babel, create-react-app, react-router, jest等。使用bootstra

当前端项目变得越来越大的时候,我们通常会将公共代码拆分出来,成为一个个独立的npm包进行维护。但是这样一来,各种包之间的依赖管理就十分让人头疼。为了解决这种问题,我们可以将不同的npm包项目都放在同一个项目来管理。这样的项目开发策略也称作 monorepo 。Lerna就是这样一个你更好地进行这项工作的工具。本文将详细介绍如何使用Lerna来辅助我们的包依赖管理。

什么是Lerna

根据官网上的定义,Lerna是一个利用 它能够自动帮助我们管理各种模块包之间的版本依赖关系。目前,已经有很多公共库都使用Lerna作为它们的模块依赖管理 工具 了,如:babel, create-react-app, react-router, jest等。

常用命令

bootstrap

使用bootstrap命令,会下载所有定义在package.json中的依赖包。相当于执行 npm install ,并且链接所有依赖包。

publish

当你完成某个包的更新后,就可以使用 lerna publish 命令来发布新版本的包。执行这条命令的时候,你可以指定版本号,然后lerna就会自动给你加更新版本号,加tag并提交到git仓库上去。

add

假设你想往你的开发项目中特定包中加入依赖,你就可以使用 add 命令轻松实现:

# 给a, b 包中加入Lodash,会同时改变a,b模块中packages.json文件
lerna add lodash packages/a packages/b 
# 给a 包中加入jquery, 使用--dev参数是使依赖加入到devDependencies中
lerna add jquery packages/a --dev
# 你也可以使用通配符, 下面这命令,会往所有re开头的模块包中加入依赖
lerna add jquery packages/re-* 
# 指定特定的范围,要使用--scope参数,如下:给b包安装a模块
lerna add a --scope=b
复制代码

clean

执行clean命令,用来删除所有模块下node_modules中的npm包。

import

你可以使用import命令导入已有的模块,并且会保留所有的git commit记录。

list

列出项目中所有的模块。

run

在每个包含该脚本的模块中运行npm脚本。

动手实战

说了那么多,我们写个例子实操一下。

初始化项目

首先,先建一个新项目,接着我们全局安装lerna,并执行初始化操作,再上传到git仓库上。:

npm intall lerna -g
mkdir lerna-demo && cd $_
lerna init
git init
git add .
git commit -m "Initial Commit"
git remote add origin http://github.com/scq000/lerna-demo.git
git push -u origin master
ls
复制代码

执行完上述命令后,就会在当前目录下生成以下几个文件:

packages/ package.json lerna.json

其中: packages目录用来存放我们需要拆分的各种公共代码库。lerna.json文件里面记录了lerna的相关配置信息:

{
  "version": "1.1.3",
  "npmClient": "npm",
  "command": {
    "publish": {
      "ignoreChanges": ["ignored-file", "*.md"],
      "message": "chore(release): publish"
    },
    "bootstrap": {
      "ignore": "component-*",
      "npmClientArgs": ["--no-package-lock"]
    }
  },
  "packages": ["packages/*"]
}
复制代码

分别介绍每个配置项的功能:

  • version: 记录当前项目的版本号
  • npmClient: 你可以指定使用npm, cnpm或yarn来执行命令
  • command.publish.ignoreChanges: 忽略特定的项
  • command.publish.npmClientArgs: 当执行lerna bootstrap命令时,传给npm install的参数
  • command.publish.message: 发布模块的时候,填写的commit信息
  • packages: 模块包默认所在的地址

你可以根据需要自己更改相应的配置。

新建两个模块

为了演示方便,我们新建两个模块, moduleA和moduleB, 并让moduleA依赖moduleB:

lerna create module-a
lerna create module-b
# 将本地包链接起来,可以直接引用
lerna link
复制代码

修改module-b 的入口文件:

export const sayHello() {
    return "hello world";
};
复制代码

修改module-a 的入口文件:

const moduleB = require('module-b');

const moduleA = function() {
    console.log(moduleB.sayHello());
}

export default moduleA;
复制代码

发布新模块

完成修改后,我们可以直接发布新的模块

lerna publish
复制代码

然后,根据提示输入版本号等,lerna就会自动帮我们给包加上tag,并上传到对应的仓库中去。

希望这个简单的例子可以能让大家熟悉简单的操作流程。

两种模式

lerna允许我们使用两种模块来管理我们的模块:Fixed 模式和Independent模式。

Fixed/Locked mode

这个模式也是我们初始化项目的时候默认采用的模式。在这种模式下, 你可以理解为"全量发布"。也就是当我们一旦有某个模块的主版本更新了,那么所有包都会拥有一个新的版本号。而主版本号,是管理在项目根目录的lerna.json文件中。

Independent mode

如果你不喜欢上面这种模式,你也可以使用Independent模式来管理项目中的模块。你只需要在初始化项目的使用指定--independent参数就可以了:

lerna init --independent
复制代码

在这种模式下,我们可以独立地更新某个包的版本号,你可以理解为"增量发布"。

可能遇到的问题及解决方案

打包太慢

在使用过程中,最经常遇到的问题是,执行 lerna bootstrap 的时候奇慢无比。这种情况通常是因为在每个独立包中都重复安装了公共依赖。在这时候,我们可以将所有公共使用的包,如react,lodash之类的移到根目录的package.json中去,并使用 lerna bootstrap --hoist 命令进行安装。使用 hoist 选项后,所有公共的依赖都只会安装在根目录的node_modules目录中去,而不会在每个包目录下的node_modules中都保留各自的依赖包。

这样一来, lerna bootstrap 的执行效率就大大增加了。

多个包版本依赖不一致

另一个可能常遇到的问题就是多个安装包之间版本不一致,比如,A包需要依赖1.0的lodash, 而B包则需要依赖2.0的lodash。这样就会导致在打包过程中多了许多重复代码。而且在同一项目下保留不同版本的npm包也难以管理。对于这个问题,在大多数情况下,我们可以尝试使用npm包管理器提供的peerDependencies选项来固定一个版本号。既可以避免很多重复的代码,也可以解决不同版本号所带来的冲突问题。

# 参考资料

github.com/lerna/lerna

——本文首发于个人公众号,转载请注明出处———

如何利用lerna管理模块

最后,欢迎大家关注我的公众号,一起学习交流。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Pro JavaScript Techniques

Pro JavaScript Techniques

John Resig / Apress / 2006-12-13 / USD 44.99

Pro JavaScript Techniques is the ultimate JavaScript book for the modern web developer. It provides everything you need to know about modern JavaScript, and shows what JavaScript can do for your web s......一起来看看 《Pro JavaScript Techniques》 这本书的介绍吧!

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具