scripts
On december 17, 2021 by adminBeskrivning
Genom egenskapen "scripts"
i din package.json
-fil finns stöd för ett antal inbyggda skript och deras förinställda livscykelhändelser samt godtyckliga skript. Dessa kan alla exekveras genom att köra npm run-script <stage>
eller npm run <stage>
förkortat. För- och efterkommandon med matchande namn kommer också att köras för dessa (t.ex. premyscript
, myscript
, postmyscript
). Skript från beroenden kan köras med npm explore <pkg> -- npm run <stage>
.
Pre & Post Scripts
För att skapa ”pre”- eller ”post”-skript för alla skript som definieras i "scripts"
-avsnittet i package.json
, skapar du helt enkelt ett annat skript med ett matchande namn och lägger till ”pre” eller ”post” i början av dem.
{"scripts": {"precompress": {"precompress": {"precompress": "{{ exekveras INNAN skriptet `compress` }}","compress":"compress":"compress":"postcompress": "{{ kör kommandot för att komprimera filer }}","postcompress": "{{ kör kommandot för att komprimera filer }}": "{{ körs EFTER skriptet `compress` }}"}}
Livscykelskripter
Det finns några speciella livscykelskripter som endast sker i vissa situationer. Dessa skript sker utöver ”pre”- och ”post”-skripten.
-
prepare
,prepublish
,prepublishOnly
,prepack
,postpack
prepare (since [email protected]
)
- Kör innan paketet packas
- Kör innan paketet publiceras
- Kör på lokal
npm install
utan några argument - Kör efter
prepublish
, men föreprepublishOnly
- Notera: Om ett paket som installeras via git innehåller ett skript
prepare
kommer dessdependencies
ochdevDependencies
att installeras och skriptet prepare att köras innan paketet paketeras och installeras.
prepublish (DEPRECATED)
- Samma som
prepare
prepublishOnly
- Körs INNAN paketet förbereds och paketeras, ENDAST på
npm publish
.
prepack
- Körs INNAN en tarball packas (på ”
npm pack
”, ”npm publish
” och vid installation av git-beroenden). - OBS: ”
npm run pack
” är INTE detsamma som ”npm pack
”. ”npm run pack
” är ett godtyckligt användardefinierat skriptnamn, medan ”npm pack
” är ett CLI-definierat kommando.
postpack
- Körs EFTER att tarbollen har genererats och flyttats till sin slutliga destination.
Förbered och förpublicera
Deprecisering Anmärkning: prepublish
Sedan [email protected]
har npm CLI kört prepublish
-skriptet för både npm publish
och npm install
, eftersom det är ett bekvämt sätt att förbereda ett paket för användning (några vanliga användningsfall beskrivs i avsnittet nedan). Det har också visat sig vara, i praktiken, mycket förvirrande. Från och med [email protected]
har en ny händelse införts, prepare
, som bevarar detta befintliga beteende. En ny händelse, prepublishOnly
, har lagts till som en övergångsstrategi för att användare ska kunna undvika det förvirrande beteendet i befintliga npm-versioner och endast köra på npm publish
(t.ex. köra testerna en sista gång för att se till att de är i gott skick).
Se https://github.com/npm/npm/issues/10074 för en mycket längre motivering, med ytterligare läsning, för den här ändringen.
Användningsfall
Om du behöver utföra åtgärder på ditt paket innan det används, på ett sätt som inte är beroende av målsystemets operativsystem eller arkitektur, använd ett prepublish
-skript. Detta inkluderar uppgifter som:
- Kompilering av CoffeeScript-källkod till JavaScript.
- Skapande av minifierade versioner av JavaScript-källkod.
- Hämtning av fjärrresurser som paketet kommer att använda.
Fördelen med att göra dessa saker vid prepublish
-tillfället är att de kan göras en gång, på ett enda ställe, och på så sätt minska komplexiteten och variabiliteten. Dessutom innebär detta att:
- Du kan vara beroende av
coffee-script
som endevDependency
, och därmed behöver dina användare inte ha den installerad. - Du behöver inte inkludera minifiers i ditt paket, vilket minskar storleken för dina användare.
- Du behöver inte förlita dig på att dina användare har
curl
ellerwget
eller andra systemverktyg på målmaskinerna.
Livscykel Driftsordning
npm publish
prepublishOnly
prepare
prepublish
publish
postpublish
npm pack
prepack
postpack
npm install
preinstall
install
postinstall
Also triggers
-
prepublish
(när på lokal) -
prepare
(när på lokal)
npm start
npm run start
har en npm start
förkortning.
prestart
start
poststart
Standardvärden
npm kommer att standardisera vissa skriptvärden baserat på paketets innehåll.
-
"start": "node server.js"
:Om det finns en
server.js
-fil i paketets rot kommer npm att förinställastart
-kommandot tillnode server.js
. -
"install": "node-gyp rebuild"
:Om det finns en
binding.gyp
-fil i roten av ditt paket och du inte har definierat egnainstall
– ellerpreinstall
-skript, kommer npm att förinställainstall
-kommandot till att kompilera med node-gyp.
Användare
Om npm har anropats med root-privilegier kommer den att ändra uid till det användarkonto eller uid som anges i user
config, vilket är nobody
som standard. Sätt flaggan unsafe-perm
för att köra skript med root-privilegier.
Environment
Paketskript körs i en miljö där många delar av informationen görs tillgänglig om inställningen av npm och processens aktuella tillstånd.
path
Om du är beroende av moduler som definierar exekverbara skript, som t.ex. testsuites, kommer dessa exekverbara skript att läggas till PATH
för att utföra skript. Så om din package.json har följande:
{"name" : "foo","dependencies" : {"bar" : "0.1.x"},"scripts": {"start" : "bar ./test"}}
då kan du köra npm start
för att exekvera skriptet bar
, som exporteras till katalogen node_modules/.bin
på npm install
.
package.json vars
Fälten i package.json häftas på prefixet npm_package_
. Så om du till exempel hade {"name":"foo", "version":"1.2.5"}
i filenpackage.json skulle dina paketskript ha miljövariabeln npm_package_name
inställd på ”foo” och npm_package_version
inställd på ”1.2.5”. Du kan komma åt dessa variabler i din kod med process.env.npm_package_name
ochprocess.env.npm_package_version
, och så vidare för andra fält.
configuration
Konfigurationsparametrar sätts in i miljön med prefixetnpm_config_
. Du kan till exempel se den effektiva root
config genom att kontrollera miljövariabeln npm_config_root
.
Special: package.json ”config” object
Nycklarna i package.json ”config” skrivs över i miljön om det finns en config-parameter av <name>:<key>
. Om package.json till exempel har följande:
{"name" : "foo","config" : {"port" : "8080"},"scripts" : {"start" : "node server.js"} }}
och server.js är detta:
http.createServer(...).listen(process.env.npm_package_config_port)
då kan användaren ändra beteendet genom att göra:
npm config set foo:port 80
aktuell livscykelhändelse
Slutligt sätts miljövariabeln npm_lifecycle_event
till vilket stadium av cykeln som helst. Så du kan ha ett enda skript som används för olika delar av processen och som växlar beroende på vad som händer för tillfället.
Objekten plattas till enligt detta format, så om du hade{"scripts":{"install":"foo.js"}}
i ditt paket.json, skulle du se detta i skriptet:
process.env.npm_package_scripts_install === "foo.js"
Exempel
Om din package.json till exempel innehåller detta:
{"scripts" : {"install" : "scripts/install.js","postinstall" : "scripts/install.js","uninstall" : "scripts/uninstall.js"}}
då kommer scripts/install.js
att anropas för livscykelns installations- och efterinstallationsstadier, och scripts/uninstall.js
kommer att anropas när paketet avinstalleras. Eftersomscripts/install.js
körs för två olika faser skulle det i det här fallet vara klokt att titta på miljövariabeln npm_lifecycle_event
.
Om du vill köra ett make-kommando kan du göra det. Detta fungerar utmärkt:
{"scripts" : {"preinstall" : "./configure","install" : "make && make install","test" : "make test"}}
Exiting
Skripten körs genom att skicka raden som ett skriptargument till sh
.
Om skriptet avslutas med en annan kod än 0 kommer detta att avbrytaprocessen.
Bemärk att dessa skriptfiler inte behöver vara nodejs- eller ensjavascript-program. De måste bara vara någon form av körbar fil.
Hook Scripts
Om du vill köra ett specifikt skript vid en specifik livscykelhändelse för ALLA paket kan du använda ett hook script.
Placera en körbar fil vid node_modules/.hooks/{eventname}
, och den kommer att köras för alla paket när de passerar genom den punkten i paketlivscykeln för alla paket som är installerade i den roten.
Hook-skript körs på exakt samma sätt som package.json-skript, det vill säga i en separat underprocess, med den env som beskrivs ovan.
Best Practices
- Avsluta inte med en felkod som inte är noll om du inte verkligen menar det.Med undantag för avinstallationsskript kommer detta att leda till att npm-åtgärden misslyckas, och eventuellt rullas tillbaka. Om felet är mindre eller endast förhindrar några valfria funktioner är det bättre att bara skriva ut en varning och avsluta framgångsrikt.
- Försök att inte använda skript för att göra det som npm kan göra åt dig. Läs igenom
package.json
för att se alla saker som du kan specificera och aktivera genom att helt enkelt beskriva ditt paket på lämpligt sätt. I allmänhet kommer detta att leda till ett mer robust och konsekvent tillstånd. - Inspektera env för att avgöra var du ska lägga saker. Om till exempel miljövariabeln
npm_config_binroot
är inställd på/home/user/bin
, försök inte installera körbara filer i/usr/local/bin
. Användaren har förmodligen ställt in den så av en anledning. - Förbered inte dina skriptkommandon med ”sudo”. Om root-behörigheter krävs av någon anledning kommer det att misslyckas med det felet, och användaren kommer att sudo npm-kommandot i fråga.
- Använd inte
install
. Använd en.gyp
-fil för kompilering ochprepublish
för allt annat. Du bör nästan aldrig behöva ställa in enpreinstall eller ett installationsskript explicit. Om du gör detta bör du överväga om det finns ett annat alternativ. Den enda giltiga användningen avinstall
ellerpreinstall
skript är för kompilering som måste göras på målarkitekturen.
Se även
- npm run-script
- package.json
- npm developers
- npm install
Lämna ett svar