跳至主要内容

发布文件配置

将包发布到注册表时,默认情况下会发布包源目录中的所有内容。这并不总是最佳选择,因为通常存在仅与开发相关的文件,例如测试和配置文件,并且您可能需要先编译源文件并将它们输出到单仓设置中的集中位置。

Lerna 提供了许多配置选项,以确保仅将适当的文件打包并发布到注册表。

"files" 和 .gitignore

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

--contents [旧版 -> 建议使用 --directory]

许多命令(包括 lerna publish)都支持一个通用的 --contents 选项,该选项设置所有包的发布目录。

仅当您单仓中的包具有简单、统一的输出结构时,此选项才对发布有用。传递给 --contents 的参数必须是发布的每个包中都存在的子目录。有关详细信息,请参阅lerna publish 文档

在 v7 中,我们引入了更强大、更集中的 --directory 选项用于 lerna publish。请优先使用该选项,而不是 --contents 选项,后者可能会在将来被弃用。

--directory

在 v7 中,我们引入了更强大、更集中的 --directory 选项用于 lerna publish

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

这意味着您现在可以简洁地表达在样式方面统一但并非在所有包中都完全相同的设置。

例如,假设我们有一个单仓,我们构建所有包,并将它们的输出设置为转到集中位置(例如,在 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