生命週期腳本
套件可以在其清單的 scripts
欄位中定義各種動作,當套件管理員執行特定工作流程時應執行這些動作。
請注意,我們不支援 npm 中原本存在的每個生命週期腳本。這是基於觀察而做出的審慎決定,因為太多生命週期腳本會讓人難以知道在何種情況下使用哪一個,進而導致混淆和錯誤。如果提供了令人信服的使用案例,我們願意逐案新增遺失的腳本。
特別是,我們故意不支援使用者定義的腳本(例如 prestart
)的任意 pre
和 post
掛勾。此行為導致腳本隱含而非明確,模糊執行流程。它有時也會導致令人驚訝的行為,例如 yarn serve
也會執行 yarn preserve
。
prepack
和 postpack
這些腳本在每次呼叫 yarn pack
的開始和結束時被呼叫。它們分別用於將您的套件從開發轉換為生產,並清除任何殘留的成品。例如,典型的 prepack
腳本會在來源目錄上呼叫 Babel 或 TypeScript,將 .ts
檔案轉換為 .js
檔案。
prepublish
此指令碼會在 yarn npm publish
甚至在封裝套件之前執行。這是您要檢查專案是否處於正常狀態的地方。
由於它僅在 prepublish 上呼叫,prepublish 鉤子不應產生副作用。特別是不要在 prepublish
中轉譯套件來源,因為直接使用您的儲存庫的人員(例如透過 git:
協定)將無法使用您的專案。請改用 prepack
。
postinstall
此指令碼會在套件相依性樹狀結構有任何變更後呼叫,通常是在相依性(或傳遞相依性)被新增、移除或更新之後,但有時也會在專案組態或環境變更時呼叫(例如變更 Node.js 版本時)。
保證會以拓撲順序呼叫(換句話說,您的相依性的 postinstall
指令碼將永遠在您的指令碼之前執行)。
為了向後相容性,如果存在 preinstall
和 install
指令碼,則會在從同一個套件執行 postinstall
指令碼之前立即呼叫它們。一般來說,優先使用 postinstall
而非這兩個指令碼。
應不惜一切代價避免使用 postinstall 指令碼,因為它們會使安裝變得更慢且更具風險。許多使用者會拒絕安裝具有 postinstall
指令碼的相依性。此外,由於輸出並未顯示在方框外,因此使用它們向使用者列印訊息不會像您預期的那樣運作。
環境變數
在執行指令碼和二進位檔時,通常會提供一些環境變數
變數 | 說明 |
---|---|
$INIT_CWD | 指令碼呼叫的目錄。這與 cwd 不同,對於指令碼而言,cwd 始終等於最近的套件根目錄。 |
$PROJECT_CWD | 檔案系統上專案的根目錄。 |
$npm_package_name | 正在執行的套件名稱。 |
$npm_package_version | 正在執行的套件版本。 |
$npm_package_json | 正在執行的套件的 package.json 的絕對路徑。 |
$npm_execpath | Yarn 二進位檔的絕對路徑。 |
$npm_node_execpath | Node 二進位檔的絕對路徑。 |
$npm_config_user_agent | 定義目前使用 Yarn 版本的字串。 |
$npm_lifecycle_event | 指令碼或生命週期事件的名稱(如果相關的話)。 |