npm 如何處理腳本(Scripts)字段?
npm 支持 package.json 文件的 "scripts" 屬性,適用于以下腳本:
npm install
上運行。(見下文)npm install
上,以及在安裝 git 依賴項時運行(見下文)。這是在預(yù)發(fā)布之后運行,但在僅預(yù)發(fā)布之前。npm publish
上運行。npm pack
、npm publish
和安裝 git 依賴項時。)npm test
命令運行。npm stop
命令運行。npm start
命令運行。注意:如果沒有提供重啟腳本,npm restart
將運行停止和啟動腳本。npm shrinkwrap
命令取消。
此外,可以通過運行npm run-script<stage>
來執(zhí)行任意腳本。具有匹配名稱的前置(pre)和后置(post)命令也將運行(例如:premyscript,myscript,postmyscript)。來自依賴項的腳本可以使用npm explore <pkg> --npm run<stage>
運行。
從npm@1.1.71
開始,npm CLI 為npm publish
和npm install
運行了 prepublish 腳本,因為這是一種準備要使用的包的便捷方式(一些常見用例在下面的部分中描述)。在實踐中,它也會變的非?;靵y。從npm@4.0.0
開始,引入了一個新時間準備,它保留了現(xiàn)有的行為。添加了一個新事件 prepublishOnly 作為過度策略,以允許用戶避免先用 npm 版本的混淆行為,并僅在 npm publish 上運行(例如,最后一次運行測試以確保它們處于良好狀態(tài))。
npm 將根據(jù)包內(nèi)容默認一些腳本值。
start
:node server.js
:
如果你的包的根目錄中有一個 server.js 文件,那么 npm 會將啟動命令默認為 node server.js。install
:node-gyp rebuild
:
如果你的包的根目錄中有一個 binding.gyp 文件,并且你沒有定義自己的安裝和預(yù)安裝腳本,npm 將默認安裝命令使用 node-gyp 進行編譯。
如果 npm 是用 root 權(quán)限調(diào)用的,那么它會將 uid 更改為用戶 config 指定的用戶賬號或者 uid,默認為nobody。設(shè)置unsafe-perm
標志以使用 root 權(quán)限運行腳本。
包腳本在一個環(huán)境中運行,在該環(huán)境中提供了許多關(guān)于 npm 設(shè)置和進程當前狀態(tài)的信息。
如果您依賴于定義可執(zhí)行腳本的模塊,例如測試套件,那么這些可執(zhí)行文件將會被添加到 PATH 以執(zhí)行腳本。所以,如果你的 package.json 文件有這個:
{"name":foot
,"dependencies":{"bar":"0.1.x"}
,"scripts":{"start":"bar ./test"}
}
然后你可以運行npm start
來執(zhí)行 bar 腳本,它在npm install
上被導(dǎo)出到node_modules/.bin
目錄中。
package.json 字段被添加到npm_package_
前綴上。因此,例如,如果您的 package.json 文件中有{"name":"foo","version":"1.2.5}
,那么您的包腳本會將npm_package_name
環(huán)境變量設(shè)置為foot
,并且npm_package_version
設(shè)置為1.2.5。
如果有<name>[@<version>]:<key>
的配置參數(shù),package.json "config"鍵在環(huán)境中被覆蓋。例如,如果 package.json 有這個:
{"name":"foo"
,"config":{"post":"8080"}
,"scripts:{"start":"node server.js"}}
server.js文件是這樣的:
http。createServer(...)。listen(process.env.npm_package_config_port)
然后用戶可以通過執(zhí)行以下的操作來更改行為:
npm config set foo:port 80
最后,將npm_lifecycle_event
環(huán)境變量設(shè)置為正在執(zhí)行的循環(huán)階段。因此,您可以將單個腳本用于流程的不同部分,該腳本根據(jù)當前發(fā)生的情況進行切換。
對象按照這種格式扁平化,所以如果你的 package.json 中有 {"scripts":{"install":"foo.js"}}
,那么你會在腳本中看到:
process.env.npm_package_scripts_install === "foo.js"
例如,如果您的 package.json 包含以下內(nèi)容:
{ "scripts" :
{ "install" : "scripts/install.js"
, "postinstall" : "scripts/install.js"
, "uninstall" : "scripts/uninstall.js"
}
}
然后 scripts/install.js 將在生命周期的安裝和安裝后階段被調(diào)用,scripts/uninstall.js 將在包被卸載時被調(diào)用。由于 scripts/install.js 運行了兩個不同的階段,因此在這種情況下查看 npm_lifecycle_event 環(huán)境變量是明智的。
如果你想運行一個 make 命令,你可以這樣做。這工作得很好:
{ "scripts" :
{ "preinstall" : "./configure"
, "install" : "make && make install"
, "test" : "make test"
}
}
通過將行作為腳本參數(shù)傳遞給 sh 來運行腳本。
如果腳本以 0 以外的代碼退出,則這將中止進程。
請注意,這些腳本文件不必是 nodejs 甚至 javascript 程序。它們只需要是某種可執(zhí)行文件。
如果要在所有包的特定生命周期事件中運行特定腳本,則可以使用鉤子腳本。
將一個可執(zhí)行文件放在 node_modules/.hooks/{eventname} 中,當所有軟件包在該根目錄中安裝的任何軟件包的軟件包生命周期中的那個點時,它將為所有軟件包運行。
Hook 腳本的運行方式與 package.json 腳本完全相同。也就是說,它們位于一個單獨的子進程中,具有上述 env。
[package.json](http://www.o2fo.com/npmjs/npmjs-u56d3ku5.html)
以查看您可以通過簡單地適當描述您的包來指定和啟用的所有內(nèi)容。一般來說,這將導(dǎo)致更健壯和一致的狀態(tài)。npm_config_binroot
環(huán)境變量設(shè)置為/home/user/bin
,則不要嘗試將可執(zhí)行文件安裝到/usr/local/bin
.?用戶可能出于某種原因以這種方式進行設(shè)置。install
.?使用.gyp
文件進行編譯,以及prepublish
?其他任何事情。您幾乎不必顯式設(shè)置預(yù)安裝或安裝腳本。如果您正在這樣做,請考慮是否還有其他選擇。install
或preinstall
?腳本的唯一有效用途是編譯,必須在目標架構(gòu)上完成。
更多建議: