跳至主要内容
非官方测试版翻译

本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →

配置发布文件

将软件包发布到注册表时,默认会发布软件包源目录中的所有内容。这通常不是最优方案,因为开发过程中常包含仅与开发相关的文件(如测试和配置文件),而且在 monorepo 设置中,您可能需要先编译源代码并将输出文件集中存放到特定位置。

Lerna 提供了多种配置选项,确保只有合适的文件会被打包并发布到注册表。

"files" 与 .gitignore

Lerna 始终使用 npm 工具进行发布,它内置了多种包含或排除文件的方式。配置发布文件最简单的方法是通过 package.json 中的 "files" 属性和 .gitignore 文件。有关 npm 如何识别发布文件的详细信息,请参阅 npm 文档

--contents [传统选项 -> 推荐改用 --directory]

包括 lerna publish 在内的多个命令支持通用选项 --contents,该选项可为所有软件包统一设置发布目录。

此选项仅在 monorepo 中的软件包具有简单统一的输出结构时适用。传递给 --contents 的参数必须是每个待发布软件包中都存在的子目录。详见 lerna publish 文档

在 v7 版本中,我们为 lerna publish 引入了功能更强大、定位更精准的 --directory 选项。请优先使用此选项替代 --contents,后者未来可能会被弃用。

--directory

在 v7 版本中,我们为 lerna publish 引入了功能更强大、定位更精准的 --directory 选项。

该选项可在 lerna.json 中配置,并支持使用以下动态占位符:{workspaceRoot}{projectRoot}{projectName}。这些值将在发布时被动态替换。

这意味着您现在可以简洁地表达那些模式统一但并非所有软件包完全相同的配置方案。

例如,假设我们有一个 monorepo 项目,其中所有软件包的构建输出都集中存放到特定位置(这在 Nx 工作区中很常见):

packages/package-a 的构建输出位于 dist/packages/package-a,而 packages/package-b 的构建输出位于 dist/packages/package-b

虽然路径完全不同,但我们可以通过占位符表达这种一致的配置模式:

{workspaceRoot}/dist/{projectRoot}

{workspaceRoot} 将被替换为 Lerna 仓库的绝对路径,而 {projectRoot}package-a 场景下会被替换为 packages/package-a,在 package-b 场景下则替换为 packages/package-b

lerna.json 中的配置方式如下:

// lerna.json
{
"version": "1.0.0",
"command": {
"publish": {
"directory": "{workspaceRoot}/dist/{projectRoot}"
}
}
}

如果需要对特定软件包进行完全自定义配置,您也可以在软件包的 package.json 中设置或覆盖发布目录选项。

以下是一个从仓库根目录下 dist/packages/foo 文件夹发布软件包的配置示例:

// packages/foo/package.json
{
"name": "foo",
"version": "1.0.0",
"lerna": {
"command": {
"publish": {
"directory": "../../dist/packages/foo"
}
}
}
}
信息

请确保您的自定义目录包含有效的 package.json,该文件将用于注册表发布。如需处理复杂自定义逻辑,可通过生命周期脚本(如 prepareprepublishOnlyprepack)创建此文件,或将其配置为资产自动从包源目录复制。完整细节请参阅即将介绍的在发布包中包含额外资产章节。

若要使某个包像标准 Lerna 包那样从源码发布,可按如下方式覆盖其发布配置:

// packages/foo/package.json
{
"name": "foo",
"version": "1.0.0",
"lerna": {
"command": {
"publish": {
"directory": "."
}
}
}
}

在发布包中包含额外资产

Lerna 可将文件从源目录复制到指定的发布目录。与 directory 选项类似,此功能可在 lerna.json 中配置(包括在资产定义中使用动态占位符),也可在特定包的 package.json 中配置。

无论在哪个文件中配置,"assets" 属性都应定义为 glob 模式数组,或包含 "from""to" 属性的对象。"from" 属性应为源目录中的具体文件或 glob 匹配模式,"to" 属性则是文件复制到发布目录中的目标路径。

此示例包将其构建输出到根目录的 dist/packages/bar 目录。Lerna 配置为将额外文件复制到该目录,然后将 dist/packages/bar 的内容发布到 npm。

// packages/bar/package.json
{
"name": "bar",
"version": "1.0.0",
"lerna": {
"command": {
"publish": {
"directory": "../../dist/packages/bar",
"assets": [
"README.md",
"package.json",
"docs/*.md",
{
"from": "static/images/*",
"to": "assets"
},
{
"from": "../../CONTRIBUTING.md",
"to": "./"
}
]
}
}
}
}

Lerna 将根据上述配置将相应文件复制到 dist 目录,生成如下结构:

dist/packages/bar
├── assets
│ ├── my-image-1.png
│ └── my-image-2.png
├── CONTRIBUTING.md
├── docs
│ ├── my-doc-1.md
│ └── my-doc-2.md
├── package.json
└── README.md