W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
npm 如何處理腳本字段
在"scripts"
你的屬性package.json
文件支持許多內(nèi)置的腳本和他們的預(yù)設(shè)生命周期事件以及任意腳本。這些都可以通過運行npm run-script <stage>
或npm run <stage>
簡稱來執(zhí)行?。前置和后?名稱匹配的命令將這些以及運行(例如premyscript
,?myscript
,postmyscript
)。依賴項的腳本可以使用?npm explore <pkg> -- npm run <stage>
.
要為"scripts"
部分中定義的任何腳本創(chuàng)建“pre”或“post”腳本?package.json
,只需創(chuàng)建另一個具有匹配名稱的腳本?并將“pre”或“post”添加到它們的開頭。
{
"scripts": {
"precompress": "{{ executes BEFORE the `compress` script }}",
"compress": "{{ run command to compress files }}",
"postcompress": "{{ executes AFTER `compress` script }}"
}
}
在本例中,npm run compress
將按照描述執(zhí)行這些腳本。
有一些特殊的生命周期腳本僅在某些情況下發(fā)生。這些腳本發(fā)生除pre<event>
,post<event>
和?<event>
腳本。
prepare
,?prepublish
,?prepublishOnly
,?prepack
,postpack
npm@4.0.0
)npm publish
?和npm pack
npm install
沒有任何參數(shù)的情況下在本地運行prepublish
,但之前prepublishOnly
prepare
?腳本,則在打包和安裝包之前dependencies
,devDependencies
將安裝其和并運行準(zhǔn)備腳本。npm@7
這些腳本在后臺運行。要查看輸出,運行帶有:--foreground-scripts
。npm publish
,但在npm ci
?和期間運行npm install
。請參閱下文了解更多信息。npm publish
.npm pack
”、“?npm publish
”和安裝 git 依賴項時)。注意:“?npm run pack
”與“?npm pack
”不同。"?npm run pack
" 是用戶定義的任意腳本名稱,其中, "?npm pack
" 是 CLI 定義的命令。郵包由于npm@1.1.71
,npm CLI 已經(jīng)prepublish
為npm publish
和運行了腳本npm install
,因為這是準(zhǔn)備要使用的包的便捷方式(一些常見用例在下面的部分中描述)。在實踐中,它也變得非?;靵y。從 開始npm@4.0.0
,引入了一個新事件prepare
,保留了這種現(xiàn)有行為。添加了一個新事件prepublishOnly
作為過渡策略,以允許用戶避免現(xiàn)有 npm 版本的混亂行為并僅繼續(xù)運行npm publish
(例如,最后一次運行測試以確保它們處于良好狀態(tài))。
請參閱https://github.com/npm/npm/issues/10074以獲得更長的理由,并進一步閱讀此更改。
如果您需要在使用之前對您的包執(zhí)行操作,以不依賴于操作系統(tǒng)或目標(biāo)系統(tǒng)架構(gòu)的方式,請使用prepublish
腳本。這包括以下任務(wù):
prepublish
按時做這些事情的好處是它們可以在一個地方做一次,從而降低復(fù)雜性和可變性。此外,這意味著:
coffee-script
的devDependency
,因此用戶不需要安裝它。curl
或wget
或其他系統(tǒng)工具。npm cache add
prepare
npm ci
preinstall
install
postinstall
prepublish
preprepare
prepare
postprepare
這些都在將模塊實際安裝到?node_modules
中后按順序運行,中間沒有發(fā)生任何內(nèi)部操作
npm diff
prepare
npm install
這些也會在你運行時運行?npm install -g <pkg-name>
preinstall
install
postinstall
prepublish
preprepare
prepare
postprepare
如果binding.gyp
你的包的根目錄中有一個文件并且你沒有定義你自己的install
或preinstall
腳本,npm 將默認(rèn)install
使用 node-gyp 編譯命令通過node-gyp rebuild
這些是從腳本運行的?<pkg-name>
npm pack
prepack
prepare
postpack
npm publish
prepublishOnly
prepack
prepare
postpack
publish
postpublish
prepare
?
期間不會運行?--dry-run
npm rebuild
preinstall``install``postinstall``prepare``prepare
?僅當(dāng)當(dāng)前目錄是符號鏈接時才運行(例如,帶有鏈接的包)
npm restart
如果restart
定義了腳本,則運行這些事件,否則?stop
,start
如果存在,則都運行,包括它們的pre
和?post
迭代)
prerestart
restart
postrestart
npm run <user defined>
pre<user-defined>
<user-defined>
post<user-defined>
npm start
prestart
start
poststart
如果server.js
包的根目錄中有一個文件,那么 npm 會將start
命令默認(rèn)為node server.js
.?prestart
并且?poststart
在這種情況下仍會運行。
npm stop
prestop
stop
poststop
npm test
pretest
test
posttest
雖然 npm v6 有uninstall
生命周期腳本,但 npm v7 沒有。刪除包的原因多種多樣,目前還沒有明確的方法可以為腳本提供足夠有用的上下文。
刪除軟件包的原因包括:
uninstall
生命周期腳本沒有實現(xiàn),也不會起作用。當(dāng) npm 以 root 身份運行時,腳本總是使用工作目錄所有者的有效 uid 和 gid 運行。
包腳本在一個環(huán)境中運行,在該環(huán)境中提供了許多關(guān)于 npm 設(shè)置和進程當(dāng)前狀態(tài)的信息。
如果您依賴于定義可執(zhí)行腳本的模塊,例如測試套件,那么這些可執(zhí)行文件將被添加到PATH
用于執(zhí)行腳本的 .?所以,如果你的 package.json 有這個:
{
"name" : "foo",
"dependencies" : {
"bar" : "0.1.x"
},
"scripts": {
"start" : "bar ./test"
}
}
然后你可以運行npm start
執(zhí)行bar
腳本,它導(dǎo)出到node_modules/.bin
的目錄npm install
。
package.json 字段被添加到npm_package_
前綴上。因此,例如,如果您{"name":"foo", "version":"1.2.5"}
的 package.json 文件中有,那么您的包腳本會將?npm_package_name
環(huán)境變量設(shè)置為“foo”,并將其?npm_package_version
設(shè)置為“1.2.5”。您可以在代碼中使用process.env.npm_package_name
和?訪問這些變量,process.env.npm_package_version
對于其他字段,依此類推。
有關(guān)package-json.md
包配置的更多信息,請參見。
最后,npm_lifecycle_event
環(huán)境變量被設(shè)置為正在執(zhí)行的循環(huán)階段。因此,您可以將單個腳本用于流程的不同部分,該腳本根據(jù)當(dāng)前發(fā)生的情況進行切換。
對象按照這種格式扁平化,所以如果你?{"scripts":{"install":"foo.js"}}
在 package.json 中有,那么你會在腳本中看到:
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
將在生命周期的安裝和安裝后階段scripts/uninstall.js
?被調(diào)用,并在包被卸載時被調(diào)用。由于?scripts/install.js
正在運行兩個不同的階段,因此在這種情況下查看npm_lifecycle_event
環(huán)境變量是明智的。
如果你想運行一個 make 命令,你可以這樣做。這工作得很好:
{
"scripts" : {
"preinstall" : "./configure",
"install" : "make && make install",
"test" : "make test"
}
}
通過將行作為腳本參數(shù)傳遞給sh
.
如果腳本以 0 以外的代碼退出,則這將中止進程。
請注意,這些腳本文件不必是 Node.js 甚至 JavaScript 程序。它們只需要是某種可執(zhí)行文件。
package.json
以查看您可以通過簡單地適當(dāng)描述您的包來指定和啟用的所有內(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
?腳本的唯一有效用途是編譯,必須在目標(biāo)架構(gòu)上完成。Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: