跳至主要內容

生命週期腳本

套件可以在其清單的 scripts 欄位中定義各種動作,當套件管理員執行特定工作流程時應執行這些動作。

資訊

請注意,我們不支援 npm 中原本存在的每個生命週期腳本。這是基於觀察而做出的審慎決定,因為太多生命週期腳本會讓人難以知道在何種情況下使用哪一個,進而導致混淆和錯誤。如果提供了令人信服的使用案例,我們願意逐案新增遺失的腳本。

特別是,我們故意不支援使用者定義的腳本(例如 prestart)的任意 prepost 掛勾。此行為導致腳本隱含而非明確,模糊執行流程。它有時也會導致令人驚訝的行為,例如 yarn serve 也會執行 yarn preserve

prepackpostpack

這些腳本在每次呼叫 yarn pack 的開始和結束時被呼叫。它們分別用於將您的套件從開發轉換為生產,並清除任何殘留的成品。例如,典型的 prepack 腳本會在來源目錄上呼叫 Babel 或 TypeScript,將 .ts 檔案轉換為 .js 檔案。

資訊

儘管很少直接呼叫,yarn pack 是 Yarn 的重要部分。每次 Yarn 必須從「原始」來源(例如 Git 儲存庫)擷取依賴項時,它會自動執行 yarn installyarn pack 以產生要使用的套件。

prepublish

此指令碼會在 yarn npm publish 甚至在封裝套件之前執行。這是您要檢查專案是否處於正常狀態的地方。

警告

由於它僅在 prepublish 上呼叫,prepublish 鉤子不應產生副作用。特別是不要在 prepublish 中轉譯套件來源,因為直接使用您的儲存庫的人員(例如透過 git: 協定)將無法使用您的專案。請改用 prepack

postinstall

此指令碼會在套件相依性樹狀結構有任何變更後呼叫,通常是在相依性(或傳遞相依性)被新增、移除或更新之後,但有時也會在專案組態或環境變更時呼叫(例如變更 Node.js 版本時)。

保證會以拓撲順序呼叫(換句話說,您的相依性的 postinstall 指令碼將永遠在您的指令碼之前執行)。

為了向後相容性,如果存在 preinstallinstall 指令碼,則會在從同一個套件執行 postinstall 指令碼之前立即呼叫它們。一般來說,優先使用 postinstall 而非這兩個指令碼。

警告

應不惜一切代價避免使用 postinstall 指令碼,因為它們會使安裝變得更慢且更具風險。許多使用者會拒絕安裝具有 postinstall 指令碼的相依性。此外,由於輸出並未顯示在方框外,因此使用它們向使用者列印訊息不會像您預期的那樣運作。

環境變數

在執行指令碼和二進位檔時,通常會提供一些環境變數

變數說明
$INIT_CWD指令碼呼叫的目錄。這與 cwd 不同,對於指令碼而言,cwd 始終等於最近的套件根目錄。
$PROJECT_CWD檔案系統上專案的根目錄。
$npm_package_name正在執行的套件名稱。
$npm_package_version正在執行的套件版本。
$npm_package_json正在執行的套件的 package.json 的絕對路徑。
$npm_execpathYarn 二進位檔的絕對路徑。
$npm_node_execpathNode 二進位檔的絕對路徑。
$npm_config_user_agent定義目前使用 Yarn 版本的字串。
$npm_lifecycle_event指令碼或生命週期事件的名稱(如果相關的話)。