Loading... 目前 [Lerna.js](https://lerna.js.org/docs/api-reference/commands "Lerna.js") 提供了 17 个命令,根据他们使用的频率,下面整理出了这些命令的用法及相关说明。 <!--more--> ## `lerna init` 该命令用于创建一个由 lerna 管理的仓库,或者将现有仓库的 lerna 更新到最新版本。用法如下: ```shell $ lerna init ``` 当执行上面命令式,lerna 会做以下 3 件事: 1. 当 `package.json` 文件中没有 lerna 依赖时,会将 lerna 添加到 `devDependencies`; 2. 在项目根目录创建一个 lerna 配置文件 `lerna.json`,并将项目的版本号 `version` 保存在 `lerna.json` 配置文件中; 3. 当 `.gitignore` 文件不存在时,会在项目根目录生成一个 `.gitignore` 文件。 ```shell $ lerna init lerna info version v2.0.0 lerna info Updating package.json lerna info Creating lerna.json lerna success Initialized Lerna files ``` ## `lerna create` 该命令用于创建一个有 Lerna 管理的软件包,创建的软件包保存在项目根目录的 `packages` 文件夹内。用法如下: ```shell $ lerna create <name> [loc] ``` 上面的命令中,`name` 表示要创建的软件包名称,比如创建一个名叫 `core` 的软件包: ```shell $ lerna create core ``` 执行上面命令后,Lerna 会在终端提供一个可交互的命令行界面,用来填写、完善该软件包的相关信息,如包名、版本号、软件包描述等。执行该命令后,默认会在 `packages` 文件夹内创建一个名为 `core` 的软件包。而后面的 `loc` 参数则允许我们自定义创建的软件包的位置,通常情况下用不到这个参数。 ## `lerna add` 该命令用来在软件包中安装依赖。可以在所有软件包中安装同一个依赖,也可以在指定的软件包中安装依赖。用法如下: ```shell $ lerna add <package>[@version] [--dev] [--exact] [--peer] ``` `package` 参数就是我们要添加的依赖,比如要在软件包中安装 `babel-core` 依赖,可以执行以下命令: ```shell $ lerna add babel-core ``` 上面的命令执行成功后,会在项目的所有软件包中安装 `babel-core` 依赖。如果只想在某一个软件包中安装 `babel-core`,可执行以下命令: ```shell $ lerna add babel-core packages/core ``` 上面命令后面的 `packages/core` 参数表示要在软件包 `core` 中安装 `babel-core` 依赖,项目的其他软件包中则不会安装该依赖。 当我们想要在某一类软件包中安装 `babel-core` 时该怎么做呢?比如项目中现在有 `prefix-core`、`prefix-utils` 、`prefix-components` 和 `services` 四个软件包,而我们想要在所有以 `prefix-` 开头的软件包中安装 `babel-core`,可执行下面的命令: ```shell $ lerna add babel-core packages/prefix-* ``` 这样,就能在所有以 `prefix-` 开头的软件包中安装 `babel-core` 依赖了。 `lerna add` 提供的 `--dev`、`--exact` 和 `--peer` 则一一对应着 `devDependencies`、`dependencies` 和 `peerDependencies`。比如: ```shell $ lerna add babel-core --scope=core --dev ``` 注意上面的 `--scope` 参数,这里表示要在指定的软件包中安装 `babel-core`,它的值是对应软件包中 `package.json` 文件中的 `name` 的值,而不是软件包的文件夹名。比如 `core` 软件包中 `package.json` 中的 `name` 是 `@smpower-cli-dev/core`,那么这条命令应该这样写: ```shell $ lerna add babel-core --scope=@smpower-cli-dev/core --dev ``` 而不能写成: ```shell $ lerna add babel-core --scope=core --dev ``` ## `lerna link` 该命令用来管理 Lerna 项目中所有软件包之间的软链接,它的作用和 `npm link` 的功能是一样的,不过要比 `npm link` 更易用、管理软连接也更加方便。用法如下: ```shell $ lerna link ``` 需要注意的是,当项目中软件包之间没有引用关系时,执行这条命令是没有作用的。只有软件包之间有引用关系,才能使用该命令建立软件包的软链接。 假如项目中有 `core` 和 `utils` 两个软件包,其中 `core` 软件包引用本地的 `utils` 软件包,那么执行 `lerna link` 后,`core` 软件包的 `package.json` 文件中就会有 `utils` 软件包的依赖,这时就建立了 `utils` 的软连接。 ## `lerna clean` 该指令可以从 Lerna 管理的项目中移除所有软件包中的 `node_modules` 文件夹。用法如下: ```shell $ lerna clean ``` `lerna clean` 不会移除项目根目录中的 `node_modules` 文件夹,只会删除软件包下的 `node_modules` 文件夹。 ## `lerna bootstrap` 这条命令的作用是将本地有引用关系的软件包链接在一起,并安装剩余软件包的第三方依赖。用法如下: ```shell $ lerna bootstrap ``` 当执行这条命令后,会做以下操作: 1. 执行 `npm install` 安装每个软件包的外部依赖(可在 `lerna.json` 配置文件中指定 `npmClient` 参数为 `npm` 、`yarn` 或 `pnpm`); 2. 将有引用关系的软件包链接在一起; 3. npm 在所有引导包中执行 `prepublish` 操作,除非传递了 `--ignore-prepublish` 参数; 4. npm 在所有引导包中执行 `prepare` 操作。 ## `lerna exec` 该指令可在每个软件包中执行任意命令。用法如下: ```shell $ lerna exec -- <command> [..args] # runs the command in all packages ``` 在实用该命令时,要注意后面跟两个中横线 `--`,之后接要执行的命令。该命令能极大地提升效率,尤其是在每个软件包中执行同一个操作时,比如要删除每个软件包下的 `node_modules` 文件夹,可执行以下命令: ```shell $ lerna exec -- rm -rf ./node_modules ``` 除此之外,还能对指定的软件包执行特定操作,比如要查看软件包 `core` 下的所有文件: ```shell $ lerna exec --scope core -- ls info cli using local version of lerna lerna notice cli v6.0.3 lerna notice filter including "core" lerna info filter [ 'core' ] lerna info Executing command in 1 package: "ls" __tests__ lib package.json README.md lerna success exec Executed command in 1 package: "ls" ``` 指定软件包时要用到 `--scope` 参数,表示要在该软件包下执行某一命令。`--scope` 参数后提供的软件包名称为 `package.json` 文件中的 `name` 字段的值,而非软件包所在的文件夹名称,这是需要注意的。 ## `lerna run` 该命令会执行每个软件包下的 npm 脚本(只有软件包下存在 npm 脚本时才会执行)。用法如下: ```shell $ lerna run <script> -- [..args] # runs npm run my-script in all packages that have it ``` 假如在每个软件包下都有一个 `build` npm 脚本,那么要执行这些软件包中的 `build` 命令就可以这样做: ```shell $ lerna run build ``` 除此之外,`lerna run` 还能执行指定软件包的 `npm` 脚本命令。比如要执行 `core` 软件包中的 `test` 脚本命令: ```shell $ lerna run --scope core test info cli using local version of lerna lerna notice cli v6.0.3 lerna notice filter including "core" lerna info filter [ 'core' ] > core:test yarn run v1.22.17 $ node ./__tests__/core.test.js core tests passed Done in 0.18s. ————————————————————————————————————————————————————————————————————————————————————————————————— > Lerna (powered by Nx) Successfully ran target test for project @smpower-cli-dev/core (963ms) ``` ## `lerna changed` 该命令列出自上次发布软件包以来有哪些软件包存在变更,可以非常方便的查看本次要发布的软件包有哪些。用法如下: ```shell $ lerna changed info cli using local version of lerna lerna notice cli v6.0.3 lerna info Assuming all packages changed @smpower-cli-dev/core @smpower-cli-dev/utils lerna success found 2 packages ready to publish ``` 可以看到,自上次发布软件包后,本次有 2 个软件包要发布,它们分别是:`@smpower-cli-dev/core` 和 `@smpower-cli-dev/utils`。 ## `lerna diff` 该命令用于查看自上次发布以来的软件包的变更,可以查看所有软件包的变更,也可查看指定软件包的变更。表现上类似于 `git diff`。用法如下: ```shell $ lerna diff # 查看所有软件包的变更 ``` 要查看指定软件包的变更,执行以下命令: ```shell $ lerna diff [package] ``` `package` 参数指的就是软件包名称,如 `lerna diff core`。需要注意的是,软件包名称取 `package.json` 文件中 `name` 字段的值,而非软件包所在文件夹的名称。 ## `lerna version` 该命令的作用是给项目的各个软件包打上版本号。执行该命令后,它会在终端提供一个可交互的命令行界面,可根据需要选择哪一种版本号。如果自上次发布以来没有任何变更,该命令则不会执行任何操作,只有当软件包内容变更并提交后,才能选择/输入一个新的版本号。示例如下: ```shell $ lerna version info cli using local version of lerna lerna notice cli v6.0.3 lerna info current version 1.0.4 lerna info Looking for changed packages since v1.0.4 ? Select a new version (currently 1.0.4) (Use arrow keys) ❯ Patch (1.0.5) Minor (1.1.0) Major (2.0.0) Prepatch (1.0.5-alpha.0) Preminor (1.1.0-alpha.0) Premajor (2.0.0-alpha.0) Custom Prerelease Custom Version ``` 也可以直接执行版本号,如: ```shell $ lerna version patch info cli using local version of lerna lerna notice cli v6.0.3 lerna info current version 1.0.4 lerna info Looking for changed packages since v1.0.4 Changes: - @smpower-cli-dev/core: 1.0.4 => 1.0.5 ? Are you sure you want to create these versions? (ynH) ``` `lerna version patch` 的效果同 `lerna version` 命令执行后选择 `Pathc` 项的效果是相同的,同样是在当前版本号后增加一个小版本号。 `lerna version` 后的参数有 `[major | minor | patch | premajor | preminor | prepatch | prerelease]`。 ## `lerna publish` 该命令会将软件包发布到 npm。用法如下: ```shell $ lerna publish info cli using local version of lerna lerna notice cli v6.0.3 lerna info current version 1.0.4 lerna info Looking for changed packages since v1.0.4 ? Select a new version (currently 1.0.4) (Use arrow keys) ❯ Patch (1.0.5) Minor (1.1.0) Major (2.0.0) Prepatch (1.0.5-alpha.0) Preminor (1.1.0-alpha.0) Premajor (2.0.0-alpha.0) Custom Prerelease Custom Version ``` 假如选择了 `Patch (1.0.5)` 选项,交互式命令行界面会再次确认我们是否要发布这些软件包: ```shell $ lerna publish info cli using local version of lerna lerna notice cli v6.0.3 lerna info current version 1.0.4 lerna info Looking for changed packages since v1.0.4 ? Select a new version (currently 1.0.4) Patch (1.0.5) Changes: - @smpower-cli-dev/core: 1.0.4 => 1.0.5 ? Are you sure you want to publish these packages? (ynH) ``` 输入 `y` 并轻按键盘回车键确认发布: ```shell $ lerna publish info cli using local version of lerna lerna notice cli v6.0.3 lerna info current version 1.0.4 lerna info Looking for changed packages since v1.0.4 ? Select a new version (currently 1.0.4) Patch (1.0.5) Changes: - @smpower-cli-dev/core: 1.0.4 => 1.0.5 ? Are you sure you want to publish these packages? Yes lerna info execute Skipping releases lerna info git Pushing tags... lerna info publish Publishing packages to npm... lerna success published @smpower-cli-dev/core 1.0.5 lerna notice lerna notice 📦 @smpower-cli-dev/core@1.0.5 lerna notice === Tarball Contents === lerna notice 70B bin/index.js lerna notice 89B lib/index.js lerna notice 765B package.json lerna notice 746B LICENSE.md lerna notice 105B README.md lerna notice === Tarball Details === lerna notice name: @smpower-cli-dev/core lerna notice version: 1.0.5 lerna notice filename: smpower-cli-dev-core-1.0.5.tgz lerna notice package size: 1.2 kB lerna notice unpacked size: 1.8 kB lerna notice shasum: 4b52fad4b489061c9949914aa140269f94e2e9e9 lerna notice integrity: sha512-OBoHCMpAt/65T[...]2xbQUXH4E0fqQ== lerna notice total files: 5 lerna notice Successfully published: - @smpower-cli-dev/core@1.0.5 lerna success published 1 package ``` 当看到最后的 `lerna success published 1 package` 时表示项目中的软件包已发布到 npm 了。在此过程中需要注意以下几点: 1. 发布软件包前,项目不应有内容未提交,即应执行过 `git commit` 操作; 2. 要发布软件包,项目根目录必须存在 `LICENSE.md` 许可证文件; 3. 要发布的软件包版本不能与已发布的软件包版本相同; 4. 发布之前应已在终端登录了 npm,如未登录则需执行 `npm login` 登录到 npm。 ## `lerna list` 该命令会将本地项目中的所有软件包列出来。用法如下: ```shell $ lerna list info cli using local version of lerna lerna notice cli v6.0.3 @smpower-cli-dev/core @smpower-cli-dev/utils lerna success found 2 packages ``` ## `lerna info` 该命令会在终端将环境信息打印出来,用法如下: ```shell $ lerna info info cli using local version of lerna lerna notice cli v6.0.3 Environment info: System: OS: Linux 5.10 Debian GNU/Linux 11 (bullseye) 11 (bullseye) CPU: (2) x64 Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz Binaries: Node: 18.12.1 - ~/.nvm/versions/node/v18.12.1/bin/node Yarn: 1.22.19 - ~/.nvm/versions/node/v18.12.1/bin/yarn npm: 8.19.2 - ~/.nvm/versions/node/v18.12.1/bin/npm Utilities: Git: 2.30.2 - /usr/bin/git npmPackages: lerna: ^6.0.3 => 6.0.3 ``` ## `lerna repair` 随着项目开发迭代,当我们把 `lerna` 从旧版本更新到较新的版本后,对应的配置文件也要做相应调整,而 `lerna repair` 命令就能帮我们自动更新其配置文件。更新 `lerna` 版本后可执行下面的命令将更新其配置文件: ```shell $ npm i lerna@latest $ lerna repair ``` ## `lerna import` 导入指定 git 仓库的包作为 lerna 管理的软件包: ```shell $ lerna import <path-to-external-repository> ``` ## `lerna caching` 该命令可用来运行设置基本缓存选项的向导。用法如下: ```shell $ lerna add-caching ``` 以上是 Lerna.js 提供的 17 个脚手架命令,想要较为熟练的掌握这些命令离不开项目实践,建议不熟悉这些命令的小伙伴们在本地创建几个 demo 搞几遍。 在一个 Lerna 项目中,我们一般这样来管理: 1. 对于一个新项目而言,我们可以使用 `lerna init` 来初始化项目。而对于一个已经存在 Lerna 项目,在从代码库将其克隆到本地后,我们可以执行 `lerna bootstrap` 命令。 2. 初始化项目后,就可以正式开发了。之后使用 `lerna create` 命令来创建软件包。 3. 在开发软件包的过程中,我们肯定会用到第三方依赖,这是就可以用 `lerna add` 命令来安装依赖。 4. 或许本地的多个软件包之间还会有相互饮用关系,这时就要用到 `lerna link` 命令了。 5. 而要执行一些命令等,可以用 `lerna exec` 或 `lerna run` 命令来实现。 6. 当我们开发完一个小功能准备提交时,可以用 `lerna diff` 或 `lerna changed` 等命令来查看项目的变更等信息。 7. 当提交变更后,就要发布软件包到 npm 了,要发布软件包就离不开 `lerna publish` 命令。此时可以执行修改版本号、打 tag 等操作。 在上面步骤中,涉及到的 lerna 命令肯定要熟练掌握,其他没有提到的命令在开发过程中也会频繁的使用到。因此,先在本地项目中多实操几次,完成几个 demo 项目的闭环操作,在真实项目中遇到问题后才能游刃有余。 祝大家在繁忙的开发工作中永无 bug,天天准点下班哦 ^_^ Last modification:November 24, 2022 © Allow specification reprint Support Appreciate the author AliPayWeChat Like 0 如果觉得我的文章对你有用,请随意赞赏
3 comments
看看评论
测试一下评论功能
看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!看看!!!!!!!!!!!!!!!!!