scripts
On 17 prosince, 2021 by adminPopis
Vlastnost "scripts"
vašeho souboru package.json
podporuje řadu vestavěných skriptů a jejich přednastavené události životního cyklu i libovolné skripty. Ty všechny lze spustit spuštěním npm run-script <stage>
nebo zkráceně npm run <stage>
. I pro ně budou spuštěny předběžné a následné příkazy se shodnými názvy (např. premyscript
, myscript
, postmyscript
). Skripty ze závislostí lze spustit pomocí npm explore <pkg> -- npm run <stage>
.
Před & Post skripty
Chcete-li vytvořit „pre“ nebo „post“ skripty pro libovolné skripty definované v sekci "scripts"
package.json
, jednoduše vytvořte další skript s odpovídajícím názvem a na jejich začátek přidejte „pre“ nebo „post“.
{"scripts": {3740>"precompress": "{{ provede se PŘED skriptem `compress` }}","compress": "{{ spustí příkaz pro kompresi souborů }}","postcompress": "{{ provede se PO skriptu `compress` }}"}}Skripty životního cyklu
Existují některé speciální skripty životního cyklu, které probíhají pouze v určitých situacích. Tyto skripty se dějí navíc ke skriptům "pre" a "post".
-
prepare
,prepublish
,prepublishOnly
,prepack
,postpack
prepare (od [email protected]
)
- Spustí se PŘED zabalením balíčku
- Spustí se PŘED zveřejněním balíčku
- Spustí se na místním
npm install
bez argumentů - Spustí se PO
prepublish
, ale PŘEDprepublishOnly
- POZN: Pokud balíček instalovaný přes git obsahuje skript
prepare
, budou před zabalením a instalací balíčku nainstalovány jehodependencies
adevDependencies
a spuštěn skript prepare.
prepublish (DEPRECATED)
- Stejné jako
prepare
prepublishOnly
- Spustí se PŘED přípravou a zabalením balíčku, POUZE na
npm publish
.
prepack
- Spustí se PŘED zabalením tarballu (na „
npm pack
„, „npm publish
“ a při instalaci závislostí git). - Poznámka: „
npm run pack
“ NENÍ totéž co „npm pack
„. „npm run pack
“ je libovolný název skriptu definovaný uživatelem, kdežto „npm pack
“ je příkaz definovaný CLI.
postpack
- Spustí se PO vygenerování tarballu a jeho přesunutí na místo určení.
Připravit a předzveřejnit
Poznámka: prepublish
Od [email protected]
spustí npm CLI skript prepublish
jak pro npm publish
, tak pro npm install
, protože je to pohodlný způsob, jak připravit balíček k použití (některé běžné případy použití jsou popsány v části níže). Ukázalo se také, že je v praxi velmi matoucí. Od [email protected]
byla zavedena nová událost prepare
, která toto stávající chování zachovává. Jako přechodná strategie byla přidána nová událost prepublishOnly
, která uživatelům umožňuje vyhnout se matoucímu chování stávajících verzí npm a spouštět pouze na npm publish
(například poslední spuštění testů, aby se ujistili, že jsou v dobré kondici).
Daleko delší zdůvodnění této změny s dalším čtením najdete v https://github.com/npm/npm/issues/10074.
Případy použití
Pokud potřebujete provést operace s balíčkem před jeho použitím způsobem, který není závislý na operačním systému nebo architektuře cílového systému, použijte skript prepublish
. Patří sem úlohy jako:
- Kompilování zdrojového kódu jazyka CoffeeScript do jazyka JavaScript.
- Vytváření minifikovaných verzí zdrojového kódu jazyka JavaScript.
- Vyhledávání vzdálených zdrojů, které bude váš balíček používat.
Výhodou provádění těchto činností v čase prepublish
je, že je lze provést jednou, na jednom místě, čímž se sníží složitost a variabilita. Navíc to znamená, že:
- Můžete záviset na
coffee-script
jako nadevDependency
, a tak jej vaši uživatelé nemusí mít nainstalovaný. - Nemusíte do balíčku zahrnovat minifikátory, čímž se zmenší velikost pro uživatele.
- Nemusíte spoléhat na to, že uživatelé mají na cílových počítačích
curl
nebowget
či jiné systémové nástroje.
Pořadí operací životního cyklu
npm publish
prepublishOnly
prepare
prepublish
publish
postpublish
npm pack
prepack
postpack
npm install
preinstall
install
postinstall
Také spouští
- .
prepublish
(při lokálním) -
prepare
(při lokálním)
npm start
npm run start
má zkratku npm start
.
prestart
start
poststart
Výchozí hodnoty
npm nastaví výchozí hodnoty některých skriptů na základě obsahu balíčku.
-
"start": "node server.js"
:Pokud je v kořenovém adresáři balíčku soubor
server.js
, pak npmw implicitně nastaví příkazstart
nanode server.js
. -
"install": "node-gyp rebuild"
:Pokud je v kořeni vašeho balíčku soubor
binding.gyp
a vy jste nedefinovali vlastní skriptyinstall
nebopreinstall
, npm přednastaví příkazinstall
pro kompilaci pomocí node-gyp.
Uživatel
Pokud bylo npm vyvoláno s právy roota, pak změní uidna uživatelský účet nebo uid zadané v konfiguraci user
, což je ve výchozím nastavení nobody
. Nastavte příznak unsafe-perm
pro spouštění skriptů s právy roota.
Prostředí
Skripty balíčků se spouštějí v prostředí, kde je k dispozici mnoho informací týkajících se nastavení npm a aktuálního stavu procesu.
cesta
Pokud jste závislí na modulech, které definují spustitelné skripty, jako například testsuites, pak budou tyto spustitelné soubory přidány do PATH
pro spouštění skriptů. Pokud tedy váš package.json obsahuje toto:
{"name" : "foo","dependencies" : {"bar" : "0.1.x"},"scripts": {"start" : "bar ./test"}}
poté byste mohli spustit npm start
a spustit skript bar
, který jeexportován do adresáře node_modules/.bin
na npm install
.
package.json vars
Pole package.json jsou připojena na předponu npm_package_
. Pokud byste tedy například v souborupackage.json měli {"name":"foo", "version":"1.2.5"}
, pak by vaše skripty balíčků měly proměnnou prostředínpm_package_name
nastavenou na „foo“ a proměnnou prostředínpm_package_version
na „1.2.5“. K těmto proměnným můžete ve svém kódu přistupovat pomocí process.env.npm_package_name
aprocess.env.npm_package_version
a tak dále pro další pole.
konfigurace
Konfigurační parametry se do prostředí vkládají s předponounpm_config_
. Například efektivní root
konfiguraci můžete zobrazit kontrolou proměnné prostředí npm_config_root
.
Speciální: package.json „config“ objekt
Klíče package.json „config“ jsou v prostředí přepsány, pokud je parametr config <name>:<key>
. Pokud má package.json například toto:
{"name" : "foo","config" : {"port" : "8080"},"scripts" : {"start" : "node server.js"}}
a server.js je tento:
http.createServer(...).listen(process.env.npm_package_config_port)
pak by uživatel mohl změnit chování provedením:
npm config set foo:port 80
aktuální událost životního cyklu
Nakonec je proměnná prostředí npm_lifecycle_event
nastavena na tu fázi cyklu, která se právě provádí. Můžete tedy mít jeden skript používaný pro různé části procesu, který se přepíná podle toho, co se právě děje.
Objekty se zplošťují podle tohoto formátu, takže pokud byste měli v balíčku{"scripts":{"install":"foo.js"}}
.json, pak byste ve skriptu viděli toto:
process.env.npm_package_scripts_install === "foo.js"
Příklady
Pokud váš package.json obsahuje například toto:
{"scripts" : {"install" : "scripts/install.js","postinstall" : "scripts/install.js","uninstall" : "scripts/uninstall.js"}}
tedy scripts/install.js
bude volán pro instalační a poinstalační fázi životního cyklu a scripts/uninstall.js
bude volán při odinstalování balíčku. Protože se scripts/install.js
spouští pro dvě různé fáze, bylo by v tomto případě rozumné podívat se na proměnnou prostředí npm_lifecycle_event
.
Pokud chcete spustit příkaz make, můžete tak učinit. Toto funguje bezvadně:
{"scripts" : {"preinstall" : "./configure","install" : "make && make install","test" : "make test"}}
Ukončení
Skripty se spouštějí předáním řádku jako argumentu skriptu sh
.
Pokud skript skončí s jiným kódem než 0, pak se přerušíproces.
Všimněte si, že tyto soubory skriptů nemusí být programy nodejs nebo dokoncejavascript. Musí to být jen nějaký spustitelný soubor.
Hákové skripty
Pokud chcete spustit určitý skript při určité události životního cyklu pro VŠECHNY balíčky, pak můžete použít hákový skript.
Umístěte spustitelný soubor na node_modules/.hooks/{eventname}
a ten se spustí pro všechny balíčky, když procházejí tímto bodem v životním cyklu balíčků pro všechny balíčky nainstalované v tomto kořenu.
Skripty s háčky se spouštějí úplně stejně jako skripty package.json, to znamená, že jsou v samostatném podřízeném procesu s výše popsaným env.
Osvědčené postupy
- Neukončujte činnost s nenulovým chybovým kódem, pokud to nemyslíte opravdu vážně. s výjimkou odinstalačních skriptů to způsobí, že akce npm selže a případně bude vrácena zpět. Pokud je chyba drobná nebo jen zabrání některým volitelným funkcím, pak je lepší jen vypsat varování a úspěšně ukončit.
- Snažte se nepoužívat skripty k tomu, co za vás může udělat npm. Přečtěte si
package.json
, abyste zjistili, co všechno můžete určit a povolit tím, že svůj balíček jednoduše vhodně popíšete. Obecně to povede k robustnějšímu a konzistentnějšímu stavu. - Prohlédněte si env, abyste zjistili, kam co umístit. Pokud je například proměnná prostředí
npm_config_binroot
nastavena na/home/user/bin
, nepokoušejte se instalovat spustitelné soubory do/usr/local/bin
. Uživatel ji tak pravděpodobně nastavil z nějakého důvodu. - Nepředkládejte příkazům skriptů předponu „sudo“. Pokud jsou z nějakého důvodu vyžadována práva roota, pak to selže s touto chybou a uživatel bude daný příkaz npm sudo.
- Nepoužívejte
install
. Pro kompilaci použijte soubor.gyp
a pro cokoli jinéhoprepublish
. Téměř nikdy byste neměli muset explicitně nastavovat apreinstalační nebo instalační skript. Pokud to děláte, zvažte, zdaexistuje jiná možnost. Jediné platné použitíinstall
nebopreinstall
skriptů je pro kompilaci, která musí být provedena na cílové architektuře.
Viz také
- npm run-script
- package.json
- npm developers
- npm install
.
Napsat komentář