.pnpmfile.cjs
pnpm 讓你可以透過特殊函式(hook)直接連接到安裝程序。hook 可以宣告在名為 .pnpmfile.cjs
的檔案中。
預設情況下,.pnpmfile.cjs
應該位於與鎖定檔相同的目錄中。例如,在具有共用鎖定檔的工作區中,.pnpmfile.cjs
應該位於單一儲存庫的根目錄中。
hook
TL;DR
hook 函式 | 程序 | 用途 |
---|---|---|
hooks.readPackage(pkg, context): pkg | 在 pnpm 解析相依套件的套件清單後呼叫 | 允許你變更相依套件的 package.json |
hooks.afterAllResolved(lockfile, context): lockfile | 在相依套件已解析後呼叫。 | 允許你變更鎖定檔。 |
hooks.readPackage(pkg, context): pkg | Promise<pkg>
允許你在解析後和解析前變更依賴項的 package.json
。不過,這些變更不會儲存到檔案系統中,然而它們會影響在鎖定檔中解析的內容,因此也會影響安裝的內容。
請注意,如果你已經解析要修改的依賴項,則需要刪除 pnpm-lock.yaml
。
如果你需要將 package.json
的變更儲存到檔案系統中,則需要使用 pnpm patch
指令和修補 package.json
檔案。例如,如果你想移除依賴項的 bin
欄位,這可能會很有用。
引數
pkg
- 套件的清單。可能是來自註冊表的回應或package.json
內容。context
- 步驟的內容物件。方法#log(msg)
允許你使用除錯記錄來執行步驟。
用法
範例 .pnpmfile.cjs
(變更依賴項的依賴項)
function readPackage(pkg, context) {
// Override the manifest of foo@1.x after downloading it from the registry
if (pkg.name === 'foo' && pkg.version.startsWith('1.')) {
// Replace bar@x.x.x with bar@2.0.0
pkg.dependencies = {
...pkg.dependencies,
bar: '^2.0.0'
}
context.log('bar@1 => bar@2 in dependencies of foo')
}
// This will change any packages using baz@x.x.x to use baz@1.2.3
if (pkg.dependencies.baz) {
pkg.dependencies.baz = '1.2.3';
}
return pkg
}
module.exports = {
hooks: {
readPackage
}
}
已知限制
透過 readPackage
從依賴項的清單中移除 scripts
欄位並不會阻止 pnpm 建立依賴項。在建立依賴項時,pnpm 會從套件的封存檔中讀取套件的 package.json
,而它不會受到掛鉤影響。若要忽略套件的建置,請使用 pnpm.neverBuiltDependencies 欄位。
hooks.afterAllResolved(lockfile, context): lockfile | Promise<lockfile>
允許你在序列化之前變更鎖定檔輸出。
引數
lockfile
- 序列化到pnpm-lock.yaml
的鎖定檔解析物件。context
- 步驟的內容物件。方法#log(msg)
允許你使用除錯記錄來執行步驟。
使用範例
function afterAllResolved(lockfile, context) {
// ...
return lockfile
}
module.exports = {
hooks: {
afterAllResolved
}
}
已知限制
沒有限制 - 任何可以使用鎖定檔完成的事情都可以透過此函數修改,您甚至可以擴充鎖定檔的功能。
相關設定
ignore-pnpmfile
- 預設值:false
- 類型:布林值
.pnpmfile.cjs
將會被忽略。當您想要確保在安裝期間不會執行任何腳本時,與 --ignore-scripts
搭配使用會很有用。
pnpmfile
- 預設值:.pnpmfile.cjs
- 類型:路徑
- 範例:.pnpm/.pnpmfile.cjs
本機 pnpmfile 的位置。
global-pnpmfile
- 預設值:null
- 類型:路徑
- 範例:~/.pnpm/global_pnpmfile.cjs
全域 pnpmfile 的位置。在安裝期間,所有專案都會使用全域 pnpmfile。
建議使用本機 pnpmfile。只有在您在非使用 pnpm 作為主要套件管理員的專案上使用 pnpm 時,才使用全域 pnpmfile。