scripts
On december 17, 2021 by adminBeschrijving
De "scripts"
eigenschap van uw package.json
bestand ondersteunt een aantal ingebouwde scripts en hun voorgeprogrammeerde life cycle events, alsmede willekeurige scripts. Deze kunnen allemaal worden uitgevoerd door npm run-script <stage>
of kortweg npm run <stage>
uit te voeren. Pre- en postcommando’s met overeenkomende namen worden ook voor deze uitgevoerd (bijv. premyscript
, myscript
, postmyscript
). Scripts van afhankelijkheden kunnen worden uitgevoerd met npm explore <pkg> -- npm run <stage>
.
Pre & Post Scripts
Om “pre” of “post” scripts te maken voor alle scripts die zijn gedefinieerd in de "scripts"
sectie van de package.json
, maakt u eenvoudig een ander script met een overeenkomstige naam en voegt u “pre” of “post” toe aan het begin ervan.
{"scripts": {"precompress": "{{ voert uit VOOR het `compress` script }}","compress": "{{ opdracht uitvoeren om bestanden te comprimeren }}","postcompress": "{{ wordt uitgevoerd NA het `compress` script }}".}}
Life Cycle Scripts
Er zijn enkele speciale life cycle scripts die alleen in bepaalde situaties voorkomen. Deze scripts komen naast het “pre” en “post” script.
-
prepare
,prepublish
,prepublishOnly
,prepack
,postpack
prepare (sinds [email protected]
)
- Draait VOORDAT het pakket wordt ingepakt
- Draait VOORDAT het pakket wordt gepubliceerd
- Draait op lokaal
npm install
zonder argumenten - Draait NA
prepublish
, maar VOORprepublishOnly
- NOTE: Als een pakket dat via git wordt geïnstalleerd een
prepare
script bevat, zullen zijndependencies
endevDependencies
worden geïnstalleerd, en zal het prepare script worden uitgevoerd, voordat het pakket wordt ingepakt en geïnstalleerd.
prepublish (DEPRECATED)
- Zoals
prepare
prepublishOnly
- Wordt uitgevoerd VOORDAT het pakket is voorbereid en ingepakt, ALLEEN op
npm publish
.
prepack
- Wordt uitgevoerd VOORDAT een tarball is ingepakt (op “
npm pack
“, “npm publish
“, en wanneer een git-dependencies wordt geïnstalleerd). - NOOT: “
npm run pack
” is NIET hetzelfde als “npm pack
“. “npm run pack
” is een willekeurige door de gebruiker gedefinieerde scriptnaam, terwijl “npm pack
” een door de CLI gedefinieerde opdracht is.
postpack
- Wordt uitgevoerd NADAT de tarball is gegenereerd en naar de uiteindelijke bestemming is verplaatst.
Prepare and Prepublish
Deprecatie Opmerking: prepublish
Sinds [email protected]
voert de npm CLI het prepublish
-script uit voor zowel npm publish
als npm install
, omdat het een handige manier is om een pakket voor gebruik voor te bereiden (enkele veelvoorkomende gebruikssituaties worden beschreven in de sectie hieronder). Het blijkt in de praktijk ook erg verwarrend te zijn. Met ingang van [email protected]
is een nieuwe event geïntroduceerd, prepare
, die dit bestaande gedrag behoudt. Een nieuwe gebeurtenis, prepublishOnly
is toegevoegd als een overgangsstrategie om gebruikers in staat te stellen het verwarrende gedrag van bestaande npm versies te vermijden en alleen op npm publish
te draaien (bijvoorbeeld de tests nog een laatste keer draaien om er zeker van te zijn dat ze in goede staat zijn).
Zie https://github.com/npm/npm/issues/10074 voor een veel langere rechtvaardiging, met verdere lectuur, voor deze verandering.
Gebruiksgevallen
Als u bewerkingen op uw pakket moet uitvoeren voordat het wordt gebruikt, op een manier die niet afhankelijk is van het besturingssysteem of de architectuur van het doelsysteem, gebruik dan een prepublish
-script. Dit omvat taken zoals:
- Compileren van CoffeeScript-broncode in JavaScript.
- Maken van geminificeerde versies van JavaScript-broncode.
- Opvragen van externe bronnen die uw pakket zal gebruiken.
Het voordeel van het doen van deze dingen op prepublish
-tijd is dat ze eenmalig kunnen worden gedaan, op een enkele plaats, waardoor de complexiteit en variabiliteit worden verminderd. Bovendien betekent dit dat:
- U kunt afhankelijk zijn van
coffee-script
als eendevDependency
, en dus hoeven uw gebruikers het niet geïnstalleerd te hebben. - U hoeft geen minifiers in uw pakket op te nemen, waardoor de omvang voor uw gebruikers kleiner wordt.
- U hoeft er niet op te vertrouwen dat uw gebruikers
curl
ofwget
of andere systeemtools op de doelmachines hebben.
Volgorde van de levenscyclus
npm publish
prepublishOnly
prepare
prepublish
publish
postpublish
npm pack
prepack
postpack
npm install
preinstall
install
postinstall
Ook triggers
-
prepublish
(wanneer op lokaal) -
prepare
(wanneer op lokaal)
npm start
npm run start
heeft een npm start
shorthand.
prestart
start
poststart
Default Values
npm zal sommige scriptwaarden standaard instellen op basis van de inhoud van het pakket.
-
"start": "node server.js"
:Als er een
server.js
-bestand in de root van uw pakket staat, dan zal npm hetstart
-commando standaard opnode server.js
zetten. -
"install": "node-gyp rebuild"
:Als er een
binding.gyp
bestand in de root van uw pakket staat en u heeft geen eigeninstall
ofpreinstall
scripts gedefinieerd, dan zal npm deinstall
opdracht standaard op node-gyp zetten.
User
Als npm werd aangeroepen met root-privileges, dan zal het de uid veranderen in de gebruikersaccount of uid gespecificeerd door de user
config, die standaard nobody
is. Zet de unsafe-perm
vlag om scripts met root rechten uit te voeren.
Omgeving
Package scripts draaien in een omgeving waar veel informatie beschikbaar wordt gemaakt over de setup van npm en de huidige status van het proces.
pad
Als u afhankelijk bent van modules die uitvoerbare scripts definiëren, zoals testsuites, dan zullen die uitvoerbare bestanden worden toegevoegd aan de PATH
voor het uitvoeren van de scripts. Dus, als uw package.json het volgende bevat:
{"name" : "foo","dependencies" : {"bar" : "0.1.x"},"scripts": {3740>"start" : "bar ./test"} },"scripts" : "0.1.x"}}dan zou u
npm start
kunnen uitvoeren om hetbar
script uit te voeren, dat wordt geëxporteerd in denode_modules/.bin
directory opnpm install
.package.json vars
De package.json velden worden geplakt op de
npm_package_
prefix. Dus, bijvoorbeeld, als u{"name":"foo", "version":"1.2.5"}
in uwpackage.json bestand had, dan zouden uw package scripts denpm_package_name
omgevingsvariabele ingesteld hebben op "foo", en denpm_package_version
ingesteld op "1.2.5". U kunt deze variabelen in uw code benaderen metprocess.env.npm_package_name
enprocess.env.npm_package_version
, en zo verder voor andere velden.configuratie
Configuratie parameters worden in de omgeving gezet met het
npm_config_
voorvoegsel. U kunt bijvoorbeeld de effectieveroot
config bekijken door denpm_config_root
omgevingsvariabele te controleren.Speciaal: package.json "config" object
De package.json "config" sleutels worden overschreven in de omgeving als er een config param van
<name>:<key>
is. Als de package.json bijvoorbeeld het volgende heeft:{"name" : "foo","config" : {"port" : "8080"},"scripts" : {"start" : "node server.js"} },"scripts" : {"start" : "node server.js}en de server.js is dit:
http.createServer(...).listen(process.env.npm_package_config_port)dan zou de gebruiker het gedrag kunnen veranderen door te doen:
npm config set foo:port 80current lifecycle event
Ten slotte wordt de omgevingsvariabele
npm_lifecycle_event
ingesteld op de fase van de cyclus die wordt uitgevoerd. U zou dus een enkel script kunnen hebben dat gebruikt wordt voor verschillende delen van het proces, dat schakelt op basis van wat er op dat moment gebeurt.Objecten worden afgevlakt volgens dit formaat, dus als u
{"scripts":{"install":"foo.js"}}
in uw package.json had staan, dan zou je dit in het script zien:process.env.npm_package_scripts_install === "foo.js"Voorbeelden
Als je package.json bijvoorbeeld dit bevat:
{"scripts" : {"install" : "scripts/install.js","postinstall" : "scripts/install.js","uninstall" : "scripts/uninstall.js"}}dan wordt
scripts/install.js
aangeroepen voor de installatie- en post-installatiefasen van de levenscyclus, enscripts/uninstall.js
wordt aangeroepen wanneer het pakket wordt verwijderd. Aangezienscripts/install.js
voor twee verschillende fasen wordt aangeroepen, zou het in dit geval verstandig zijn om naar de omgevingsvariabelenpm_lifecycle_event
te kijken.Als u een make commando wilt uitvoeren, kunt u dat doen. Dit werkt prima:
{"scripts" : {"preinstall" : "./configure","install" : "make && make install","test" : "make test"}}Afsluiten
Scripts worden uitgevoerd door de regel als scriptargument door te geven aan
sh
.Als het script afsluit met een andere code dan 0, wordt het proces afgebroken.
Merk op dat deze scriptbestanden geen nodejs of zelfs geen javascript-programma's hoeven te zijn. Ze hoeven alleen maar een soort uitvoerbaar bestand te zijn.
Hook Scripts
Als u een specifiek script wilt uitvoeren op een specifieke lifecycle event voor ALLE pakketten, dan kunt u een hook script gebruiken.
Plaats een uitvoerbaar bestand op
node_modules/.hooks/{eventname}
, en het zal worden uitgevoerd voor alle pakketten wanneer ze door dat punt in de package lifecycle gaan voor alle pakketten die in die root zijn geïnstalleerd.Hook scripts worden op precies dezelfde manier uitgevoerd als package.json scripts. Dat wil zeggen, ze zitten in een apart child proces, met de hierboven beschreven env.
Best Practices
- Ga niet weg met een foutcode van nul tenzij je het echt meent. Behalve voor uninstall scripts, zal dit de npm actie doen mislukken, en mogelijk worden teruggedraaid. Als de fout klein is of alleen enkele optionele functies zal voorkomen, dan is het beter om gewoon een waarschuwing af te drukken en succesvol af te sluiten.
- Probeer geen scripts te gebruiken om te doen wat npm voor jou kan doen. Lees
package.json
door om te zien wat je allemaal kunt opgeven en inschakelen door je pakket gewoon goed te beschrijven. In het algemeen zal dit leiden tot een meer robuuste en consistente staat. - Inspecteer de env om te bepalen waar je dingen moet zetten. Bijvoorbeeld, als de
npm_config_binroot
omgevingsvariabele is ingesteld op/home/user/bin
, probeer dan niet om uitvoerbare bestanden te installeren in/usr/local/bin
. De gebruiker heeft dit waarschijnlijk niet voor niets zo ingesteld. - Geef geen voorvoegsel voor uw script commando’s met “sudo”. Als root permissies nodig zijn om een of andere reden, dan zal het mislukken met die fout, en de gebruiker zal sudo het npm commando in kwestie.
- Gebruik geen
install
. Gebruik een.gyp
bestand voor compilatie, enprepublish
voor al het andere. U zou bijna nooit een installatie- of installatie-script expliciet moeten hoeven in te stellen. Als u dit toch doet, overweeg dan of er een andere optie is. Het enige geldige gebruik vaninstall
ofpreinstall
scripts is voor compilatie, wat moet gebeuren op de doelarchitectuur.
Zie ook
- npm run-script
- package.json
- npm developers
- npm install
Geef een antwoord