npm (i przędza) przekazuje wiele danych z package.json do skryptów jako zmienne środowiskowe. Użyj, npm run env
aby zobaczyć je wszystkie. Jest to udokumentowane w https://docs.npmjs.com/misc/scripts#environment i dotyczy nie tylko skryptów „cyklu życia”, prepublish
ale także każdego skryptu wykonywanego przez npm run
.
Możesz uzyskać dostęp do tych wewnętrznych kodów (np. process.env.npm_package_config_port
W JS), ale są one już dostępne dla powłoki wykonującej skrypty, więc możesz również uzyskać do nich dostęp jako $npm_...
rozszerzenia w „skryptach” (składnia unixowa, może nie działać w systemie Windows?).
Sekcja „config” wydaje się przeznaczona do tego zastosowania:
"name": "myproject",
...
"config": {
"port": "8010"
},
"scripts": {
"start": "node server.js $npm_package_config_port",
"test": "wait-on http://localhost:$npm_package_config_port/ && node test.js http://localhost:$npm_package_config_port/"
}
Ważną cechą tych pól „config” jest to, że użytkownicy mogą je zastąpić bez modyfikowania pliku package.json !
$ npm run start
> myproject@0.0.0 start /home/cben/mydir
> node server.js $npm_package_config_port
Serving on localhost:8010
$ npm config set myproject:port 8020
$ git diff package.json # no change!
$ cat ~/.npmrc
myproject:port=8020
$ npm run start
> myproject@0.0.0 start /home/cben/mydir
> node server.js $npm_package_config_port
Serving on localhost:8020
Zobacz dokumentację konfiguracji npm config i przędzy .
Wygląda na to, że przędza czyta, ~/.npmrc
więc npm config set
wpływa na oba, ale yarn config set
pisze ~/.yarnrc
, więc tylko przędza to zobaczy :-(