@lerna/bootstrap

将本地包链接在一起并安装剩余的包依赖项

英文原地址

安装 lerna 以访问lerna CLI。

使用

lerna bootstrap
1

引导当前 Lerna 仓库中的包。安装器所有·依赖项并连接所有的交叉依赖。

在运行时,该命令:

  1. npm install每个包所有的外部依赖。
  2. 将所有相互依赖的 Lerna package符号链接在一起。
  3. 在所有引导包中运行npm run prepublish(除非传入了--ignore-prepublish)。
  4. 在所有引导包中运行npm run prepare

lerna bootstrap接受所有过滤器属性

通过将额外的参数放在--之后来传递给 npm 客户端:

lerna bootstrap -- --production --no-optional
1

lerna.json中这样配置:

{
  "npmClient": "yarn",
  "npmClientArgs": ["--production", "--no-optional"]
}
1
2
3
4

--hoist [glob]

在仓库根目录安装与glob匹配的外部依赖,这样所有包都可以使用他们。这些依赖的任何二进制文件都将链接到依赖包的node_modules/.bin/目录中,这样 npm 脚本就可以使用它们了。如果传了该参数但却没有设置glob,则默认为**(提升所有)。该配置项仅影响bootstrap命令。

lerna bootstrap --hoist
1

关于--hoist,请参阅文档hoist documentation

注意

如果包依赖于不同版本的外部依赖项,则会将最常用的版本提升,并发出警告。

--hoistfile:标识符不兼容,请只使用一个。

--strict

当和hoist一起使用时,会抛出一个错误,并在发出版本警告后停止引导。如果没有hoist或没有版本警告则无效果。

--nohoist [glob]

不要在仓库根目录安装与glob匹配的外部依赖项。该参数可以用来选择不提升某些依赖项。

lerna bootstrap --hoist --nohoist=babel-*
1

--ignore

lerna bootstrap --ignore component-*
1

该参数与bootstrap命令一起使用时,也可以在lerna.jsoncommand.bootstrap.ignore中设置。命令行中设置该参数优先于lerna.json

{
  "version": "0.0.0",
  "command": {
    "bootstrap": {
      "ignore": "component-*"
    }
  }
}
1
2
3
4
5
6
7
8

提示

通配符匹配的是package.json中定义的包名,而不是与包所在的目录名。

配置项

--ignore-prepublish

跳过在引导包中默认运行的预发布生命周期脚本。注意,这个生命周期是已废弃的,可能会在Lerna 的下一个主要版本中被删除。

lerna bootstrap --ignore-prepublish
1

--ignore-scripts

跳过在引导包中正常运行的生命周期脚本(prepare等等)。

lerna bootstrap --ignore-scripts
1

--registry <url>

当使用该参数时,转发的 npm 命令将为您的包使用指定的注册表。

如果您不想在使用私有注册表时在所有 package.json 文件中分别设置注册表配置,那么这就是它出场的时候了。

--npm-client <client>

它必须是一个知道如何安装 npm 包依赖的可执行文件。默认的--npm-clientnpm

lerna bootstrap --npm-client=yarn
1

也可在lerna.json中配置:

{
  "npmClient": "yarn"
}
1
2
3

--use-workspaces

支持和 yarn 工作区 (从yarn@0.27+版本开始)数组中的值是 Lerna 将在其中委托操作给 Yarn 的命令(目前仅在 bootstrap 中可用)。如果--use-workspaces为真,那么packages将被package.json/workspaces的值覆盖。

也可在lerna.json中配置:

{
  "npmClient": "yarn",
  "useWorkspaces": true
}
1
2
3
4

根级别的 package.json 还必须包含一个工作区数组:

{
  "private": true,
  "devDependencies": {
    "lerna": "^2.2.0"
  },
  "workspaces": ["packages/*"]
}
1
2
3
4
5
6
7

这个列表与 lerna 的 package配置大体上类似(通过 package.json 用通配符匹配的目录列表),只是它不支持递归的通配符匹配(**,也叫“globstars”)

--no-ci

当使用默认的--npm-clientlerna bootstrap将调用npm ci而非在 CI 环境中调用npm install。若要禁用此行为,可以使用--no-ci:

lerna bootstrap --no-ci
1

若要在本地安装期间强制执行(在本地安装中不会自动启用),请使用--ci

lerna bootstrap --ci
1

这对于“干净的”重新安装或重新克隆后的初次安装非常有用。

--force-local

lerna bootstrap --force-local
1

当使用该参数时,它会让bootstrap命令始终符号链接本地依赖项,而不考虑匹配的版本范围。

publishConfig.directory

这个非标准字段允许您自定义符号链接子目录,它会作为符号链接的源目录,就像使用已发布的包一样。

"publishConfig": {
  "directory": "dist"
}
1
2
3

在本例中,当这个包被引导并链接时,dist目录将是源目录(例如package-1/dist => node_modules/package-1)。

它是怎么工作的?

让我们以babel为例:

  • babel-generatorsource-map(以及其他)是babel-core的依赖项。
  • babel-corepackage.json将这两个包作为dependencies中列出,如下所示。
// babel-core package.json
{
  "name": "babel-core",
  // ...
  "dependencies": {
    // ...
    "babel-generator": "^6.9.0",
    // ...
    "source-map": "^0.5.0"
  }
}
1
2
3
4
5
6
7
8
9
10
11
  • Lerna 会检查每个依赖项是否也是 Lerna 仓库的一部分。
    • 在本例中,babel-generator可以是内部依赖项,而source-map始终是外部依赖项。
    • babel-corepackage.json中的babel-generator版本通过packages/babel-generator来对应,传递内部依赖项。
    • source-map和正常一样使用npm install(或yarn)安装。
  • packages/babel-core/node_modules/babel-generator符号链接到packages/babel-generator
  • 允许目录嵌套引入。

注意

  • 当仓库中相同名称的包不能满足包中的依赖版本时,它将像往常一样以npm installyarn的方式安装。
  • 类似latest的 Dist-tag,并不满足语义化版本范围。
  • 循环依赖会导致循环符号链接,这可能会影响编辑器/IDE。

WebStorm会在出现循环符号链接时锁定。为了防止这种情况,在首选项(Preferences) => 编辑器(Editor) => 文件类型(File Types) => 忽略文件和文件夹(Ignored files and folders)列表中添加node_modules