Jak ustawić NODE_ENV na produkcję / rozwój w OS X

Odpowiedzi:

663

Przed uruchomieniem aplikacji możesz to zrobić w konsoli,

export NODE_ENV=production

Lub jeśli jesteś w systemie Windows, możesz spróbować tego:

SET NODE_ENV=production

lub możesz uruchomić swoją aplikację w ten sposób:

NODE_ENV=production node app.js

Możesz również ustawić go w swoim pliku js:

process.env.NODE_ENV = 'production';

Ale nie sugeruję robić tego w pliku środowiska wykonawczego, ponieważ nie jest łatwo otworzyć VIM na serwerze i zmienić go na produkcyjny. Możesz utworzyć plik config.json w swoim katalogu i za każdym razem, gdy aplikacja uruchomi się, odczyta z niego i ustawi konfigurację.

Farid Nouri Neshat
źródło
12
To zła rada. Będzie to trudne, process.env.NODE_ENVniezawodne ustawienie z poziomu samej aplikacji. Najlepiej ustaw poprawnie zmienną środowiskową, tak jak Daniel poniżej.
MK Safi
15
Jestem fanem ustawiania NODE_ENVjawnie przy każdym uruchomieniu aplikacji, jak w drugim przykładzie ( NODE_ENV=production node app.js). W ten sposób potencjalnie uratujesz się przed przyszłym pociąganiem za włosy w przypadku, gdy zapomnisz NODE_ENVprzywrócić lokalnemu development.
Jon
Wcale nie tak genialne. Za każdym razem, gdy uruchamiasz aplikację, musisz dodawać tę zmienną env. To jest do bani. Poniżej zamieszczono lepsze rozwiązanie.
Lukas Liesis
2
Patrz npmjs.com/package/cross-env prostego rozwiązania cross-platformowej. cross-env NODE_ENV=productiondziała na systemach Windows i Linux / Mac.
AntonB
1
@Gleb NODE_ENV=production forever app.jspowinien działać.
Farid Nouri Neshat,
102

w pakiecie.json:

{
  ...
  "scripts": {
    "start": "NODE_ENV=production node ./app"
  }
  ...
}

następnie uruchom w terminalu:

npm start
Taro Alan
źródło
1
nie zaczynaj umieszczać wielu skryptów w pakiecie.json, to zła praktyka, ponieważ wprowadzasz niespójności i zabija to niezmienność w twoich projektach. Wiem, że wiele osób tworzy skrypty uruchamiające chrząkanie lub przełykanie, ale nie rób tego
PositiveGuy
38
@WeDoTDD o czym mówisz? Skrypty te powinny być używane podobnie do makefile. Użycie go jako tego przykładu lub jak już wspomniałeś do uruchomienia gulp jest całkowicie rozsądnym przypadkiem użycia. W przypadku prostych zadań nie używam teraz nawet gulp i robię to wszystko w skrypcie, znacznie szybciej jest działać, i pozwalam webpackowi wykonywać pracę, którą kiedyś robił gulp.
Marko Grešak,
15
@WTF - Co to znaczy, że używanie skryptów w pakiecie.json to „zła praktyka”? Taki jest punkt skryptu: sekcja, aby umieścić skrypty! Jest całkowicie poprawny i eliminuje potrzebę przełykania lub chrząkania. Wszystko to odbywa się za pomocą polecenia i pakietu internetowego.
TetraDev,
6
@WTF Korzystanie ze skryptów w rzeczywistości znacznie poprawia spójność. Możesz skonfigurować standardowy zestaw poleceń, które będą używane w wielu projektach, które mogą nie używać tych samych podstawowych skryptów kompilacji, bibliotek itp. Możesz przynajmniej spróbować poprzeć swój punkt widzenia faktami i przykładami.
Lewis Diamond,
4
Wstawienie NODE_ENV=productionpliku package.json nie ma większego sensu. Uruchomienie npm startw fazie rozwojowej spowoduje uruchomienie go w produkcji. Możesz napisać kod tak, jakby zawsze był produkcyjny, ponieważ zawsze uruchamiasz go w ten sposób. Jedynym powodem, dla którego to robię, byłoby wymuszenie działania innych modułów (np. Express) w trybie produkcyjnym. Po co w ogóle używać zmiennych środowiskowych, jeśli nigdy się nie zmieniają?
Nateowami
66

Nikogo .envtu jeszcze nie wymieniono ? Utwórz .envplik w katalogu głównym aplikacji, a następnie require('dotenv').config()przeczytaj wartości. Łatwo zmieniany, łatwy do odczytu, wieloplatformowy.

https://www.npmjs.com/package/dotenv

Thomas McCabe
źródło
1
Dziwne, nikt o tym nie wspomina, moim zdaniem najlepsze rozwiązanie. Umieść nazwę środowiska w tym samym pliku z resztą zmiennych.
Asinus Rex
2
Ustawienie NODE_ENV w pliku .env nie będzie działać. Zobacz to: github.com/motdotla/dotenv/issues/328
Michael
U mnie ustawienie "mode": "production"w .envpliku działało.
DarkLite1
46

export NODE_ENV=production jest złym rozwiązaniem, znika po ponownym uruchomieniu.

jeśli nie chcesz się już martwić tą zmienną - dodaj ją do tego pliku:

/etc/environment

nie używaj składni eksportu, po prostu napisz (w nowym wierszu, jeśli jakaś zawartość już tam jest):

NODE_ENV=production

działa po ponownym uruchomieniu. Nie będziesz musiał ponownie wprowadzać komendy export NODE_ENV = produkcyjnej w dowolnym miejscu i po prostu użyj węzła z czymkolwiek chcesz - na zawsze, pm2 ...

Dla heroku:

heroku config:set NODE_ENV="production"

co jest tak naprawdę domyślne.

Lukas Liesis
źródło
2
Koszmar utrzymania. Co ze skrzynką, w której nie masz uprawnień do / etc?
Thomas McCabe
1
Osobiście używam NODE_ENV=production gulp bundle-production-appdo spakowania gotowego skryptu produkcyjnego, na serwerze NODE_ENV znajduje się w środowisku serwera, a na komputerze dewelopera go nie ma. W niektórych maszynach koszmar, jeśli nie jest ustawiony, i oczekujesz, że będzie zawsze ustawiony . W niektórych oczekujesz, że go nie będziesz, więc nie dodajesz. W każdym razie, robiąc interfejsy, wyjaśniam, czy jest w trybie programowania, więc nigdy nie masz pytania, czy jest włączony, czy wyłączony. Jeśli NODE_ENV jest! == produkcja, to w twojej twarzy znajdujesz się w innym trybie, więc nie ma koszmaru. Wszystko jasne, wszystko dobrze.
Lukas Liesis
+1 za rozmowę o tym, jak go utrzymać. Zastanawiam się, ile osób ustawiło to tylko w bieżącej sesji, myśląc, że będzie się utrzymywać. A co przed ponownym uruchomieniem? Jeśli chcesz go ustawić od razu, powinieneś go zainstalować /etc/environment i uruchomić export NODE_ENV=production?
Nateowami
23

Aby nie martwić się, czy uruchamiasz skrypty w systemie Windows, Mac lub Linux, zainstaluj pakiet cross-env . Następnie możesz łatwo używać swoich skryptów, tak jak:

"scripts": {
    "start-dev": "cross-env NODE_ENV=development nodemon --exec babel-node -- src/index.js",
    "start-prod": "cross-env NODE_ENV=production nodemon --exec babel-node -- src/index.js"
}

Ogromne rekwizyty dla twórców tego pakietu.

npm install --save-dev cross-env
Notoryczny
źródło
22
heroku config:set NODE_ENV="production"
david_adler
źródło
2
ahhh właśnie tego potrzebowałem. jesteś niesamowity
Connor Leech
5
NODE_ENV=productionjest teraz domyślny we wdrożeniach Heroku node.js.
Sean
1
Heroku nie jest jedynym miejscem do wdrożenia
Pavan Katepalli
9

W przypadku programu Windows Powershell użyj tego polecenia

$env:NODE_ENV="production" ; node app.js
Harikrishnan
źródło
6

W OSX polecam dodanie export NODE_ENV=developmentdo twojego ~/.bash_profilei / lub ~/.bashrci / lub~/.profile .

Osobiście dodaję ten wpis do mojego, ~/.bashrca następnie mam~/.bash_profile ~/.profile importuję zawartość tego pliku, dzięki czemu jest spójny w różnych środowiskach.

Po dodaniu tych dodatków uruchom ponownie terminal, aby wybrać ustawienia.

Vincil Bishop
źródło
2

Jeśli korzystasz z systemu Windows. Najpierw otwórz cmd w prawym folderze

set node_env={your env name here}

naciśnij Enter, możesz zacząć od węzła

node app.js

zacznie się od ustawienia env

garenyondem
źródło
1
czy nie zniknie po ponownym uruchomieniu? Nie mam okien, nie mogę spróbować.
Lukas Liesis
Jeśli pytasz o restart węzła nie, nie zniknie, dopóki nie zamkniesz wiersza polecenia. Ale jeśli system Windows Server uruchomi się ponownie, zniknie.
garenyondem
2
mówiąc o ponownym uruchomieniu systemu operacyjnego. Dlatego lepiej znaleźć inny sposób, aby przestać się zastanawiać za każdym razem, gdy instalowane są aktualizacje systemu Windows lub po prostu restartować, na temat tego problemu.
Lukas Liesis
2

Jeśli używasz webpacka w swojej aplikacji, możesz po prostu go tam ustawić, używając DefinePlugin...

Więc w swojej pluginsekcji ustaw NODE_ENV na production:

plugins: [
  new webpack.DefinePlugin({
    'process.env.NODE_ENV': '"production"',
  })
]
Alireza
źródło
1

Aby mieć wiele środowisk, potrzebujesz wcześniej wszystkich odpowiedzi (parametr NODE_ENV i wyeksportuj go), ale używam bardzo prostego podejścia bez potrzeby instalowania czegokolwiek. W pliku package.json umieść skrypt dla każdej potrzebnej env, na przykład:

...
"scripts": {
    "start-dev": "export NODE_ENV=dev && ts-node-dev --respawn --transpileOnly ./src/app.ts",
    "start-prod": "export NODE_ENV=prod && ts-node-dev --respawn --transpileOnly ./src/app.ts"
  }
 ...

Następnie, aby uruchomić aplikację zamiast npm startkorzystania z niejnpm run script-prod .

W kodzie możesz uzyskać dostęp do bieżącego środowiska za pomocą process.env.NODE_ENV .

Voila

rmpt
źródło
NODE_ENV powinien być albo „programowaniem”, albo „produkcją”, powyższe nie jest rozpoznawane przez kod innej firmy (chociaż możesz na to patrzeć w process.env)
John Culviner
1

Windows CMD -> set NODE_ENV=production

Windows Powershell -> $env:NODE_ENV="production"

MAC -> export NODE_ENV=production

Janith Udara
źródło
0

Daniel ma fantastyczną odpowiedź, która jest lepszym podejściem do prawidłowego procesu wdrażania (ustaw i zapomnij).

Dla osób korzystających z ekspresu. Możesz użyć serwera grunt-express-server, który również jest fantastyczny. https://www.npmjs.org/package/grunt-express-server

Jesse
źródło
0

Może to być szansa, że ​​wykonałeś dwa wystąpienia obiektu sekwencjonowania

na przykład: var con1 = new Sequelize (); var con2 = new Sequelize ();

niż ten sam błąd wystąpi

Prakhar Dixit
źródło