配置发布文件
将包发布到注册表时,默认情况下会发布包源目录中的所有内容。这并不总是最优的,因为通常有一些仅与开发相关的文件,如测试和配置文件,并且在 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
。如果需要更复杂的自定义逻辑,可以通过生命周期脚本(如 prepare
、prepublishOnly
或 prepack
)创建此文件,或者通过配置资源自动为您复制。有关完整详细信息,请参见即将到来的在已发布包中包含其他资源部分。
如果您希望使一个包的行为像标准的 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