Jak ustawić niektóre zmienne środowiskowe od wewnątrz package.json
aby były używane z npm start
podobnymi poleceniami?
Oto, co obecnie mam w moim package.json
:
{
...
"scripts": {
"help": "tagove help",
"start": "tagove start"
}
...
}
Chcę ustawić zmienne środowiskowe (np NODE_ENV
) w skrypcie startowym, a jednocześnie jest w stanie uruchomić aplikację z jednym poleceniu npm start
.
node.js
npm
package.json
npm-scripts
dev.meghraj
źródło
źródło
Odpowiedzi:
Ustaw zmienną środowiskową w poleceniu skryptowym:
Następnie użyj
process.env.NODE_ENV
w swojej aplikacji.Uwaga:
env
zapewnia, że działa na różnych platformach. Możesz go pominąć, jeśli dbasz tylko o Mac / Linux.źródło
set NODE_ENV=test&& mocha --reporter spec
- celowo nie ma spacji między testem a &&."test": "NODE_ENV=test mocha --reporter spec"
nie będzie działać w systemach Windows.env NODE_ENV=test mocha --reporter spec
użyje zadeklarowanej zmiennej środowiskowej w sposób natywny na wiele platform, ale kluczem jest to, że jest używana przez npm w trybie ad hoc i jednorazowo, tylko do wykonania skryptu npm. (Nie jest ustawiony ani eksportowany do wykorzystania w przyszłości.) Tak długo, jak uruchamiasz polecenie ze skryptu npm, nie ma problemu. Ponadto „&&” należy usunąć, robiąc to w ten sposób.Wystarczy użyć pakietu NPM cross-env . Super łatwe. Działa w systemach Windows, Linux i wszystkich środowiskach. Zauważ, że nie używasz && do przejścia do następnego zadania. Po prostu ustaw env, a następnie rozpocznij następne zadanie. Kredyt dla @mikekidder za sugestię w jednym z komentarzy tutaj.
Z dokumentacji:
Zauważ, że jeśli chcesz ustawić wiele globalnych zmiennych, wystarczy podać je kolejno, a następnie polecenie, które ma zostać wykonane.
Ostatecznie polecenie, które jest wykonywane (za pomocą spawn) to:
NODE_ENV
Zmienna zostanie ustalona przez cross-ENVźródło
"test": "cross-env TS_NODE_COMPILER_OPTIONS='{\\\"module\\\":\\\"commonjs\\\"}' mocha"
env
czycross-env
? Z jednej strony env nie wymaga ode mnie instalacji, az drugiej stronycross-env
jest bardziej popularny. Czy ktoś może potwierdzić, czyenv
działa na wszystkich platformach?env
nie działa tak, jak jest na wszystkich platformach, stąd powódcross-env
istnienia. Po prostu użyjcross-env
i gotowe.Chciałem tylko dodać tutaj dwa centy dla przyszłych eksploratorów węzłów. Na moim Ubuntu 14.04
NODE_ENV=test
nie działało, musiałem użyć,export NODE_ENV=test
po czymNODE_ENV=test
zacząłem działać, dziwne.W systemie Windows, jak już powiedziano, musisz używać,
set NODE_ENV=test
ale dla rozwiązania wieloplatformowego biblioteka cross-env nie wydawała się załatwić i czy naprawdę potrzebujesz biblioteki, aby to zrobić:Pionowe paski są potrzebne, ponieważ w przeciwnym razie system Windows zawiesiłby się na nierozpoznanym
export NODE_ENV
poleceniu: D. Nie wiem o końcowej spacji, ale dla pewności też je usunąłem.źródło
&&
?NODE_ENV=test yadda
oznacza „uruchomyadda
, ustawianieNODE_ENV
wyadda
zmiennych środowiskowych.NODE_ENV=test && yadda
” oznacza „ustawNODE_ENV
w środowisku lokalnym, ale nie eksportuj go, a następnie uruchomyadda
.”NODE_ENV=test yadda
to preferowane podejście.NODE_ENV=test && npm run test
lub czegoś podobnego. Zrobiłem lepsze rozwiązanie, korzystając zprocess.env["NODE_ENV"] = "testing";
mojego pliku testhelper.js.&&
straconymi zmiennymi środowiskowymi, ustawienie zmiennych środowiskowych bez eksportu działa tylko na bieżącym poleceniu (co jest niczym). uruchomić polecenie ze zmienną env bez eksportowania u zrobić:NODE_ENV=test npm run test
. Wreszcie powodem, dla którego zadziałało po wyeksportowaniu, jest to, że zmienna ur jest teraz dostępna (wyeksportowana) w sesji, więc twój NODE_ENV bez eksportu nic nie robił.Ponieważ często pracuję z wieloma zmiennymi środowiskowymi, uważam, że warto je przechowywać w osobnym
.env
pliku (pamiętaj, aby zignorować to z poziomu kontroli źródła).Następnie dodaj
export $(cat .env | xargs) &&
przed poleceniem skryptu.Przykład:
Do testu można wyświetlić zmienne env, uruchamiając
npm run env
(Linux) lubnpm run env-windows
(Windows).źródło
&&
aby mogło działać - jeśli masz wiele plików .env, może być trochę trudniej utrzymać Twoja odpowiedź zainspirowała mnie do przygotowania tej sugestii: stackoverflow.com/questions/25112510/...Wypróbuj to w systemie Windows, zastępując
YOURENV
:źródło
nagle odkryłem, że Actionhero używa następującego kodu, który rozwiązał mój problem, przekazując
--NODE_ENV=production
opcję polecenia start skryptu.Byłbym naprawdę wdzięczny za przyjęcie odpowiedzi kogoś, kto wie lepiej, jak ustawić zmienne środowiskowe w pakiecie.json lub skrypcie inicjującym lub coś w tym rodzaju, gdzie aplikacja została uruchomiona przez kogoś innego.
źródło
W przypadku większego zestawu zmiennych środowiskowych lub gdy chcesz ich ponownie użyć, możesz użyć
env-cmd
../.env
plik:./package.json
:źródło
process.env.ENV1
mongod --dbpath ~/data/db
. Chcę uruchomić coś takiego,npm mongodb
a to otrzyma zmienną środowiskową dbpath i uruchomi mondodb tak jak zawsze ... i .. chcę udostępnić go innym członkom.Chociaż nie odpowiadam bezpośrednio na pytanie, chciałbym podzielić się pomysłem z innymi odpowiedziami. Z tego, co otrzymałem, każdy z nich oferowałby pewien poziom złożoności w celu osiągnięcia niezależności między platformami.
W moim scenariuszu pierwotnie chciałem ustawić zmienną, aby kontrolować, czy zabezpieczyć serwer za pomocą uwierzytelniania JWT (do celów programistycznych)
Po przeczytaniu odpowiedzi postanowiłem po prostu utworzyć 2 różne pliki z włączonym i wyłączonym uwierzytelnianiem.
Pliki to po prostu opakowania, które wywołują oryginalny plik index.js (którego nazwę zmieniłem
appbootstrapper.js
):Być może może to pomóc komuś innemu
źródło
źródło
Będzie to działać w konsoli Windows :
npm run aaa
wynik:
test
Zobacz tę odpowiedź, aby uzyskać szczegółowe informacje.
źródło
set TMP=test&& npm run bbb
. Poprzednia przestrzeń&&
będzie również zaciskać się w ramach tegoNODE_ENV
ciągu"
.Nie należy ustawiać zmiennych ENV w
package.json
. Actionhero używa,NODE_ENV
abyś mógł zmienić opcje konfiguracji, które są ładowane z plików w./config
. Sprawdź plik konfiguracyjny redis i zobacz, jak NODE_ENV używa do zmiany opcji bazy danychNODE_ENV=test
Jeśli chcesz użyć innych zmiennych ENV do ustawienia rzeczy (być może portu HTTP), nadal nie musisz nic zmieniać
package.json
. Na przykład, jeśli ustawiłeśPORT=1234
ENV i chcesz użyć tego jako portu HTTPNODE_ENV=production
, po prostu odwołaj się do tego w odpowiednim pliku konfiguracyjnym, IE:źródło
npm start
poleceniu. Korzystanie fragment powyżej, jeśli chcesz uruchomić serwer za pomocą portu ENV byłoby:export PORT=1234; npm start
. Możesz dołączyć tyle deklaracji ENV, ile potrzebujesz, ale nie należą one do pliku package.json. Jeśli martwisz się o upewniając się, że istnieje należy użyć domyślnych ustawień w pliku konfiguracyjnym:port: process.env.PORT || 8080
.NODE_ENV=test npm start
lub ustawić je przy użyciu powłokinpm (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 przeznpm 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:
Ważną cechą tych pól „config” jest to, że użytkownicy mogą je zastąpić bez modyfikowania pliku package.json !
Zobacz dokumentację konfiguracji npm config i przędzy .
Wygląda na to, że przędza czyta,
~/.npmrc
więcnpm config set
wpływa na oba, aleyarn config set
pisze~/.yarnrc
, więc tylko przędza to zobaczy :-(źródło
Odpowiedź Luke'a była prawie taka, jakiej potrzebowałem! Dzięki.
Ponieważ wybrana odpowiedź jest bardzo prosta (i poprawna), ale stara, chciałbym zaoferować alternatywę dla importowania zmiennych z osobnego pliku .env podczas uruchamiania skryptów i naprawienia pewnych ograniczeń odpowiedzi Luke'a. Spróbuj tego:
::: plik .env :::
Następnie w pakiecie json utworzysz skrypt, który ustawi zmienne i uruchom go przed skryptami, których potrzebujesz:
::: package.json :::
Niektóre spostrzeżenia:
Wyrażenie regularne w poleceniu grep'ed cat usunie komentarze i puste linie.
&&
Nie muszą być „przyklejony” donpm run set-env
, jak to jest wymagane, jeśli zostały ustawienie zmiennych w tej samej komendy.Jeśli używasz przędzy, możesz zobaczyć ostrzeżenie, możesz ją zmienić na
yarn set-env
lub użyćnpm run set-env --scripts-prepend-node-path &&
zamiast tego.Różne środowiska
Kolejną zaletą korzystania z niego jest to, że możesz mieć różne zmienne środowiskowe.
źródło
użyj git bash w Windows. Git Bash przetwarza polecenia inaczej niż cmd.
Większość podpowiedzi poleceń systemu Windows dusi się podczas ustawiania zmiennych środowiskowych za pomocą NODE_ENV = produkcja w ten sposób. (Wyjątkiem jest Bash w Windows, który używa natywnego Bash.) Podobnie, istnieje różnica w sposobie wykorzystania zmiennych środowiskowych przez komendy Windows i POSIX. W systemie POSIX używasz: $ ENV_VAR, a w systemie Windows używasz% ENV_VAR%. - cross-env doc
użyj pakietu dotenv, aby zadeklarować zmienne env
źródło