跳到主要內容

設定已發佈檔案

將套件發布到註冊表時,預設會發布套件原始目錄中的所有內容。這並非總是最佳方式,因為通常有某些檔案僅與開發相關,例如測試和設定檔,而且在單一儲存庫設定中,您可能先編譯原始檔案,再將其輸出至集中式位置。

Lerna 提供多項設定選項,確保僅包裝及發布適當的檔案到註冊表中。

"files" 和 .gitignore

Lerna 始終使用 npm 的工具進行發布,且有幾種內建方式可以包含或排除檔案。設定哪些檔案會包含在已發佈套件中的最簡單方法,是透過 package.json.gitignore 中的「files」屬性。請參閱 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}。這些值會在發布時動態替換。

這表示你现在可以用简洁的方式表达各方面风格一致、但所有套件在字面上并不完全相同的设定

例如,我们有一个 monorepo,用于构建所有套件,并且它们的输出被设置为传送到一个集中位置(例如,这是 Nx 工作区中的常见设定)

我们有 packages/package-a,其构建输出写入 dist/packages/package-a,还有 packages/package-b,其构建输出写入 dist/packages/package-b

虽然这两个路径截然不同,但我们有一个一致的方法,现在可以使用占位符来表达

{workspaceRoot}/dist/{projectRoot}

{workspaceRoot} 会被 lerna 储存库的绝对路径取代,而 {projectRoot} 会在 packages/package-a 的情况下被 packages/package-a 取代,在 packages/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