scripts
On december 17, 2021 by adminBeskrivelse
Den "scripts"
egenskab i din package.json
fil understøtter en række indbyggede scripts og deres forudindstillede livscyklusbegivenheder samt vilkårlige scripts. Disse kan alle udføres ved at køre npm run-script <stage>
eller npm run <stage>
forkortet npm run <stage>
. For- og efterkommandoer med matchende navne vil også blive kørt for disse (f.eks. premyscript
, myscript
, postmyscript
). Skripter fra afhængigheder kan køres med npm explore <pkg> -- npm run <stage>
.
Pre & Post Scripts
For at oprette “pre” eller “post” scripts for alle scripts defineret i "scripts"
afsnittet i package.json
skal du blot oprette et andet script med et matchende navn og tilføje “pre” eller “post” i begyndelsen af dem.
{"scripts": {"precompress": {"precompress": "{{ udføres FØR scriptet `compress` }}}","compress":"compress": "{{ kører kommando til at komprimere filer }}}","postcompress": "{{ run command to compress files }}","postcompress": "{{ eksekveres EFTER `compress` scriptet }}"}}
Livscyklus-scripts
Der er nogle særlige livscyklus-scripts, som kun sker i visse situationer. Disse scripts forekommer i tillæg til “pre”- og “post”-scriptet.
-
prepare
,prepublish
,prepublishOnly
,prepack
,postpack
prepare (siden [email protected]
)
- Kører FØR pakken pakkes
- Kører FØR pakken offentliggøres
- Kører på local
npm install
uden argumenter - Kører EFTER
prepublish
, men FØRprepublishOnly
- OPMÆRKNING: Hvis en pakke, der installeres via git, indeholder et
prepare
-script, vil detsdependencies
ogdevDependencies
blive installeret, og forberedelsesscriptet vil blive kørt, før pakken pakkes og installeres.
prepublish (DEPRECATED)
- Samme som
prepare
prepublishOnly
- Kører INDEN pakken er forberedt og pakket, KUN på
npm publish
.
prepack
- Kører FØR en tarball pakkes (på “
npm pack
“, “npm publish
” og ved installation af en git-afhængighed). - BEMÆRK: “
npm run pack
” er IKKE det samme som “npm pack
“. “npm run pack
” er et vilkårligt brugerdefineret scriptnavn, hvorimod “npm pack
” er en CLI-defineret kommando.
postpack
- Kører, EFTER at tarball’en er blevet genereret og flyttet til sin endelige destination.
Forbered og prepublish
Deprecisering Bemærk: prepublish
Siden [email protected]
har npm CLI kørt prepublish
-scriptet for både npm publish
og npm install
, fordi det er en praktisk måde at forberede en pakke til brug på (nogle almindelige anvendelsestilfælde er beskrevet i afsnittet nedenfor). Det har også vist sig at være, i praksis, meget forvirrende. Fra [email protected]
er der indført en ny begivenhed, prepare
, som bevarer denne eksisterende adfærd. En ny hændelse, prepublishOnly
, er blevet tilføjet som en overgangsstrategi for at give brugerne mulighed for at undgå den forvirrende adfærd i de eksisterende npm-versioner og kun køre på npm publish
(f.eks. for at køre testene en sidste gang for at sikre, at de er i god form).
Se https://github.com/npm/npm/issues/10074 for en meget længere begrundelse, med yderligere læsning, for denne ændring.
Use Cases
Hvis du har brug for at udføre operationer på din pakke, før den bruges, på en måde, der ikke er afhængig af målsystemets operativsystem eller arkitektur, skal du bruge et prepublish
script. Dette omfatter opgaver som:
- Kompilering af CoffeeScript-kildekode til JavaScript.
- Skabelse af minificerede versioner af JavaScript-kildekode.
- Hentning af fjernressourcer, som din pakke vil bruge.
Førdelen ved at udføre disse ting på prepublish
tidspunktet er, at de kan udføres én gang, et enkelt sted, hvilket reducerer kompleksiteten og variabiliteten. Derudover betyder det, at:
- Du kan afhænge af
coffee-script
som endevDependency
, og dermed behøver dine brugere ikke at have den installeret. - Du behøver ikke at inkludere minifiers i din pakke, hvilket reducerer størrelsen for dine brugere.
- Du behøver ikke at stole på, at dine brugere har
curl
ellerwget
eller andre systemværktøjer på målmaskinerne.
Livscyklus Driftsorden
npm publish
prepublishOnly
prepare
prepublish
publish
postpublish
npm pack
prepack
postpack
npm install
preinstall
install
postinstall
Alligevel udløser
-
prepublish
(når på lokal) -
prepare
(når på lokal)
npm start
npm run start
har en npm start
forkortelse.
prestart
start
poststart
Standardværdier
npm vil standardisere nogle scriptværdier baseret på pakkens indhold.
-
"start": "node server.js"
:Hvis der er en
server.js
-fil i roden af din pakke, så vil npm standardindstillestart
-kommandoen tilnode server.js
. -
"install": "node-gyp rebuild"
:Hvis der er en
binding.gyp
-fil i roden af din pakke, og duikke har defineret dine egneinstall
– ellerpreinstall
-scripts, vil npm standardisereinstall
-kommandoen til at kompilere ved hjælp af node-gyp.
User
Hvis npm blev kaldt med root-privilegier, vil den ændre uid til den brugerkonto eller det uid, der er angivet i user
config, som er standard nobody
. Sæt unsafe-perm
-flaget for at køre scripts med root-privilegier.
Environment
Pakkescripts køres i et miljø, hvor mange oplysninger er tilgængelige vedrørende opsætningen af npm og processens aktuelle tilstand.
path
Hvis du er afhængig af moduler, der definerer eksekverbare scripts, som f.eks. testsuites, vil disse eksekverbare scripts blive tilføjet til PATH
forexeksekveringen af scripts. Så hvis din package.json har dette:
{"name" : "foo","dependencies" : {"bar" : "0.1.x"},"scripts": {"start" : "bar ./test"}}
så kan du køre npm start
for at udføre bar
-scriptet, som eksporteres til node_modules/.bin
-mappen på npm install
.
package.json vars
Felterne i package.json er hæftet på npm_package_
-præfikset. Så hvis du f.eks. havde {"name":"foo", "version":"1.2.5"}
i dinpackage.json-fil, ville dine pakkescripts havenpm_package_name
-miljøvariablen sat til “foo” ognpm_package_version
sat til “1.2.5”. Du kan få adgang til disse variabler i din kode med process.env.npm_package_name
ogprocess.env.npm_package_version
, og så videre for andre felter.
konfiguration
Konfigurationsparametre sættes i miljøet med præfiksetnpm_config_
. Du kan f.eks. se den effektive root
config ved at kontrollere miljøvariablen npm_config_root
.
Special: package.json “config”-objekt
Nøglerne i package.json “config” overskrives i miljøet, hvis der er en config-parameter på <name>:<key>
. Hvis package.json f.eks. har dette:
{"name" : "foo","config" : {"port" : "8080"},"scripts" : {"start" : "node server.js"}}
og server.js er denne:
http.createServer(...).listen(process.env.npm_package_config_port)
så kan brugeren ændre adfærden ved at gøre:
npm config set foo:port 80
current lifecycle event
Sidst er miljøvariablen npm_lifecycle_event
indstillet tilhvilken fase af cyklussen, der udføres. Så du kan have et enkelt script, der bruges til forskellige dele af processen, og som skifter alt efter, hvad der sker i øjeblikket.
Objekter flatteres efter dette format, så hvis du havde{"scripts":{"install":"foo.js"}}
i din pakke.json, så ville du se dette i scriptet:
process.env.npm_package_scripts_install === "foo.js"
Eksempler
For eksempel, hvis din package.json indeholder dette:
{"scripts" : {"install" : "scripts/install.js","postinstall" : "scripts/install.js","uninstall" : "scripts/uninstall.js"}}
så vil scripts/install.js
blive kaldt for installations- og post-installationsfaserne i livscyklusen, og scripts/uninstall.js
vil blive kaldt, når pakken afinstalleres. Dascripts/install.js
kører for to forskellige faser, vil det i dette tilfælde være klogt at se på miljøvariablen npm_lifecycle_event
.
Hvis du ønsker at køre en make-kommando, kan du gøre det. Dette virker fint:
{"scripts" : {"preinstall" : "./configure","install" : "make && make install","test" : "make test"}}
Afslutter
Scripts køres ved at sende linjen som et scriptargument til sh
.
Hvis scriptet afsluttes med en anden kode end 0, vil dette afbrydeprocess.
Bemærk, at disse scriptfiler ikke behøver at være nodejs- eller enddajavascript-programmer. De skal bare være en slags eksekverbar fil.
Hook-scripts
Hvis du ønsker at køre et bestemt script ved en bestemt livscyklusbegivenhed for ALLE pakker, kan du bruge et hook-script.
Placér en eksekverbar fil ved node_modules/.hooks/{eventname}
, og den vil blive kørt for alle pakker, når de gennemgår dette punkt i pakkens livscyklus for alle pakker, der er installeret i denne rod.
Hook-scripts køres på nøjagtig samme måde som package.json-scripts.Det vil sige, de er i en separat underordnede proces, med den env, der er beskrevet ovenfor.
Bedste praksis
- Afslut ikke med en fejlkode, der ikke er nul, medmindre du virkelig mener det.Bortset fra afinstallationsskripter vil dette medføre, at npm-handlingen fejler, og potentielt bliver rullet tilbage. Hvis fejlen er mindre eller kun vil forhindre nogle valgfrie funktioner, så er det bedre blot at udskrive en advarsel og afslutte med succes.
- Forsøg ikke at bruge scripts til at gøre det, som npm kan gøre for dig. Læs igennem
package.json
for at se alle de ting, du kan angive og aktivere ved blot at beskrive din pakke på passende vis. Generelt vil dette føre til en mere robust og konsistent tilstand. - Inspicér env’en for at bestemme, hvor tingene skal placeres. Hvis f.eks. miljøvariablen
npm_config_binroot
er sat til/home/user/bin
, skal du ikke forsøge at installere eksekverbare filer i/usr/local/bin
. Brugeren har sandsynligvis sat den op på den måde af en grund. - Lad være med at give dine scriptkommandoer et præfiks med “sudo”. Hvis root-tilladelser er påkrævet af en eller anden grund, vil det mislykkes med denne fejl, og brugeren vil sudo den pågældende npm-kommando.
- Brug ikke
install
. Brug en.gyp
-fil til kompilering, ogprepublish
til alt andet. Du bør næsten aldrig eksplicit skulle skulle indstille etpreinstall- eller install-script. Hvis du gør dette, bedes du overveje, om der er en anden mulighed. Den eneste gyldige brug afinstall
ellerpreinstall
skripter er til kompilering, som skal foretages på målarkitekturen.
Se også
- npm run-script
- package.json
- npm developers
- npm install
Skriv et svar