Package.json içinden ortam değişkenleri nasıl ayarlanır


313

Bazı ortam değişkenleri içerden benzer komutlarla package.jsonkullanılacak şekilde nasıl ayarlanır npm start?

İşte şu anda benim var package.json:

{
  ...
  "scripts": {
    "help": "tagove help",
    "start": "tagove start"
  }
  ...
}

NODE_ENVHala tek bir komut ile uygulamayı başlatmak mümkün iken, başlangıç ​​komut dosyasında ortam değişkenleri (gibi ) ayarlamak istiyorum npm start.


Yanıtlar:


433

Ortam değişkenini kod komutunda ayarlayın:

...
"scripts": {
  "start": "node app.js",
  "test": "env NODE_ENV=test mocha --reporter spec"
},
...

Ardından process.env.NODE_ENVuygulamanızda kullanın .

Not: envplatformlar arasında çalışmasını sağlar. Yalnızca Mac / Linux'u önemsiyorsanız bunu atlayabilirsiniz.


65
Birisi pencereler için bir alternatif bulmuş mudur ..?
sonsuzluk

65
@ infinity çapraz env kullanır ve kullanımı çok kolaydır.
mikekidder

106
@ infinity kullanımı set NODE_ENV=test&& mocha --reporter spec- test ile && bilerek kullanım arasında boşluk yoktur.
Jamie Penney

18
"test": "NODE_ENV=test mocha --reporter spec"Windows sistemlerinde çalışmaz.
Benny Neugebauer

7
@ infinity @ jamie-penney env NODE_ENV=test mocha --reporter spec, bildirilen ortam değişkenini yerel olarak çapraz platform biçiminde kullanacaktır, ancak anahtar, npm tarafından yalnızca npm komut dosyası yürütme için geçici ve tek seferlik bir şekilde kullanılmasıdır. (İleride başvurmak üzere ayarlanmamış veya dışa aktarılmamıştır.) Komutunuzu npm komut dosyasından çalıştırdığınız sürece sorun yoktur. Ayrıca, "&&" bu şekilde kaldırılmalıdır.
18'de

219

Sadece NPM paket çapraz-env kullanın . Süper kolay. Windows, Linux ve tüm ortamlarda çalışır. Bir sonraki göreve geçmek için && kullanmadığınıza dikkat edin. Env'yi ayarlayıp bir sonraki görevi başlatmanız yeterlidir. Buradaki yorumlardan birinde öneri için @mikekidder'e teşekkür ederiz .

Belgelerden:

{
  "scripts": {
    "build": "cross-env NODE_ENV=production OTHERFLAG=myValue webpack --config build/webpack.config.js"
  }
}

Birden fazla global değişken ayarlamak istiyorsanız, bunları arka arkaya ve ardından yürütülecek komutunuzu belirttiğinize dikkat edin.

Sonuçta, yürütülen komut (spawn kullanarak):

webpack --config build/webpack.config.js

NODE_ENVÇevre değişkeni çapraz env tarafından belirlenecektir


Üçlü ters eğik çizgiler gerekli tırnak kaçmak için kullanılabilir:"test": "cross-env TS_NODE_COMPILER_OPTIONS='{\\\"module\\\":\\\"commonjs\\\"}' mocha"
bvj

1
En iyi çözüm çünkü çapraz platformlar.
bernardn

Sonunda birisi bana kullanmalıyım olmadığına karar edebilir envya cross-env? Bir yandan, env hiçbir şey kurmamı gerektirmiyor, diğer yandan cross-envdaha popüler. Birisi lütfen envtüm platformlarda çalışıp çalışmadığını doğrulayabilir mi?
Rishav

2
@Rishav envtüm platformlarda olduğu gibi çalışmaz, bu nedenle var olma nedeni cross-env. Sadece kullanın cross-envve onunla yapın.
TetraDev

37

İki sentimi gelecekteki Düğüm kaşifleri için buraya eklemek istedim. Ubuntu 14.04'ümde NODE_ENV=testişe yaramadı, kullanmak zorunda kaldım, export NODE_ENV=testsonra da NODE_ENV=testçalışmaya başladım, garip.

Windows'da söylendiğiniz gibi kullanmanız gerekiyor, set NODE_ENV=testancak çapraz platform çözümü için çapraz env kütüphanesi hile gibi görünmüyordu ve bunu yapmak için gerçekten bir kütüphaneye ihtiyacınız var mı:

export NODE_ENV=test || set NODE_ENV=test&& yadda yadda

Dikey çubuklar gereklidir, aksi takdirde Windows tanınmayan export NODE_ENVkomutta kilitlenir : D. Sondaki boşluk hakkında bilmiyorum ama sadece onları da çıkardığımdan emin olmak için.


6
Kullandın &&NODE_ENV=test yaddavasıta "koşmak yadda, ayar NODE_ENViçinde yadda. ortam değişkenleri 'in NODE_ENV=test && yaddaaracı 'set NODE_ENVyerel ortamında, ancak, daha sonra çalıştırmak ihraç yok yadda'. NODE_ENV=test yaddaTercih yaklaşımdır.
Josh Kelley

Üzgünüm, stackoverflow hesabımı bir süredir kontrol etmedim. Ama temelde aptal Windows kullanarak NODE_ENV=test && npm run testveya benzeri bir şey işe yaramadı . process.env["NODE_ENV"] = "testing";Testhelper.js dosyamın içinde kullanarak daha iyi bir çözüm yaptım.
TeemuK

5
@TeemuK sadece iki sentimi de eklemek için, komutunuzu sizinle birlikte çalıştırdığınızda &&ortam değişkenlerinizi kaybettiniz, dışa aktarma olmadan ortam değişkenlerini ayarlamak sadece geçerli komutta çalışır (hiçbir şey değildir). u do: 'yı dışa aktarmadan env değişkeni ile komutu çalıştırmak için NODE_ENV=test npm run test. Son olarak, dışa aktardıktan sonra çalışmasının nedeni, ur değişkeninin oturumda artık kullanılabilir (dışa aktarılmış) olması, NODE_ENV'nizin dışa aktarım olmadan hiçbir şey yapmamasıdır.
Tarek

37

Kendimi genellikle birden çok ortam değişkeniyle çalışırken bulduğum için, bunları ayrı bir .envdosyada tutmanın yararlı olduğunu düşünüyorum (bunu kaynak denetiminizden yoksayı unutmayın).

VAR_A=Hello World
VAR_B=format the .env file like this with new vars separated by a line break

Sonra export $(cat .env | xargs) &&komut dosyası komutunuzun önüne ekleyin.

Misal:

{
  ...
  "scripts": {
    ...
    "start": "export $(cat .env | xargs) && echo do your thing here",
    "env": "export $(cat .env | xargs) && env",
    "env-windows": "export $(cat .env | xargs) && set"
  }
  ...
}

Bir test için env değişkenlerini npm run env(linux) veya npm run env-windows(windows) çalıştırarak görüntüleyebilirsiniz.


Çok iyi, neredeyse benim için iş yaptı! Birkaç yorum eklemek istiyorum: - .env dosyanızda boş satırlar olamaz - .env dosyanızdaki yorumlar komut dosyanızı bozacaktır - Birden fazla komut dosyası aynı .env dosyasını kullanıyorsa, bunu tekrarlamanız gerekir - &&Çalışması için daha önce alanı kaldırmak zorunda kaldım - Birden fazla .env dosyanız varsa, cevabınızı korumak biraz daha zor olabilir Bu öneriyi hazırlamak için bana ilham verdi: stackoverflow.com/questions/25112510/…
Felipe N Moura

19

Bunu değiştirerek Windows'ta deneyin YOURENV:

  {
    ...
     "scripts": {
       "help": "set NODE_ENV=YOURENV && tagove help",
       "start": "set NODE_ENV=YOURENV && tagove start"
     }
    ...
  }

1
Evet! Teşekkür ederim! Aradığım cevap buydu! : D
Daniel Tonon

6
&&'Den önce alanı kaldırmak zorunda kaldım.
Kenneth Solberg

@ KennethSolberg adlı kullanıcının yorumu benim için işe yarayan son dokunuş (sadece Windows)
ulu

Benim de uzay meselem vardı. Dize uzunluğunu günlüğe kaydederken boşluğun eklendiğini söyleyebilirim. Kaçan alıntıları denedim - ve aslında envarda saklandılar. Diğer sınırlayıcıları boşuna denedim. Alanın kaldırılması ya da bana yanlış gelen değerin kırpılması bu sorunun tek yoluydu.
Neil Guy Lindberg

8

aniden actionhero aşağıdaki kodu kullanıyor, bu sadece --NODE_ENV=productionkomut dosyası komut seçeneği geçerek benim sorun çözüldü bulundu .

if(argv['NODE_ENV'] != null){
  api.env = argv['NODE_ENV'];
} else if(process.env.NODE_ENV != null){
  api.env = process.env.NODE_ENV;
}

Gerçekten paket değişkenleri çevre değişkenleri ayarlamak için daha iyi bir yol bilen başka birinin cevap kabul ediyorum takdir ediyorum.


4

Daha geniş bir ortam değişkeni kümesi için veya bunları yeniden kullanmak istediğinizde kullanabilirsiniz env-cmd.

./.env dosya:

# This is a comment
ENV1=THANKS
ENV2=FOR ALL
ENV3=THE FISH

./package.json:

{
  "scripts": {
    "test": "env-cmd mocha -R spec"
  }
}

senaryoda ENV1'i nasıl kullanıyorsunuz?
ValRob

Olağanprocess.env.ENV1
KARASZI István

ama, paketin içinde. imkansız okudum (?)
ValRob

Anlamıyorum. Neden bunu yapasın ki?
KARASZI István

belki aptalca bir yaklaşım, ama macOs Catalina güncelleme vardı ve şimdi komut mongodb çalışmıyor, bu yüzden veri / klasör belirtmek gerekir mongod --dbpath ~/data/db. Ben gibi bir şey çalıştırmak istiyorum npm mongodbve bu ortam değişkeni dbpath alacak ve her zamanki gibi mondodb çalıştırmak ... ve .. ben diğer üyeleri ile paylaşmak istiyorum.
ValRob

2

Soruyu doğrudan cevaplamasa da, diğer cevapların üstünde bir fikir paylaşmak istiyorum. Bunlardan her birini aldığımdan, platformlar arası bağımsızlığa ulaşmak için bir miktar karmaşıklık sunacaktı.

Benim senaryomda, başlangıçta, sunucuyu JWT kimlik doğrulamasıyla güvence altına alıp almayacağınızı kontrol etmek için bir değişken ayarlamak istedim (geliştirme amaçlı)

Yanıtları okuduktan sonra, kimlik doğrulaması sırasıyla açık ve kapalı olmak üzere 2 farklı dosya oluşturmaya karar verdim.

  "scripts": {
    "dev": "nodemon --debug  index_auth.js",
    "devna": "nodemon --debug  index_no_auth.js",
  }

Dosyalar basitçe (adını değiştirdiğim appbootstrapper.js) orijinal index.js dosyasını çağıran sarmalayıcılardır :

//index_no_auth.js authentication turned off
const bootstrapper = require('./appbootstrapper');
bootstrapper(false);

//index_auth.js authentication turned on
const bootstrapper = require('./appbootstrapper');
bootstrapper(true);

class AppBootStrapper {

    init(useauth) {
        //real initialization
    }
}

Belki bu başka birine yardımcı olabilir


2
{
  ...
  "scripts": {
    "start": "ENV NODE_ENV=production someapp --options"
  }
  ...
}

2

Bu, Windows konsolunda çalışır :

"scripts": {
  "aaa": "set TMP=test && npm run bbb",
  "bbb": "echo %TMP%"
}

npm run aaa

çıktı: test

Ayrıntılar için bu cevaba bakınız.


5
Olmalı set TMP=test&& npm run bbb. Önceki boşluk &&da o zamanlar NODE_ENVdizenin bir parçası olarak
dolacak

@FisNaN Tırnaklarla çevreliyorsanız durum böyle olmamalı ".
kaiser

1

ENV değişkenlerini ayarlamamalısınız package.json. actionhero NODE_ENV, içindeki dosyalardan yüklenen yapılandırma seçeneklerini değiştirmenize izin vermek için kullanır ./config. Redis yapılandırma dosyasını kontrol edin ve NODE_ENV'nin veritabanı seçeneklerini değiştirmek için nasıl kullanıldığını görün.NODE_ENV=test

Bir şeyleri ayarlamak için başka bir ENV değişkeni kullanmak istiyorsanız (belki HTTP bağlantı noktası), yine de hiçbir şeyi değiştirmenize gerek yoktur package.json. Örneğin, PORT=1234ENV'de ayarladıysanız ve bunu HTTP bağlantı noktası olarak kullanmak istiyorsanız NODE_ENV=production, ilgili yapılandırma dosyasında IE'ye başvurmanız yeterlidir:

# in config/servers/web.js
exports.production = { 
  servers: {
    web: function(api){
      return {
       port: process.env.PORT
      }
    }
  }
}

harika. Sanırım sorumu okumadınız .. Benim sorunum nasıl NODE_ENV ayarlamak için ne kullanmaktır.
dev.meghraj

1
Birden çok ortam özelliği ayarlamak istiyorsanız, bunu npm startkomutta yapmazsınız. Eğer ENV bağlantı noktasını kullanarak sunucu yapmak isterse yukarıdaki pasajı kullanarak, o olurdu: export PORT=1234; npm start. İhtiyacınız olduğu kadar ENV bildirimi ekleyebilirsiniz, ancak bunlar package.json dosyasına ait değildir. Emin yapma konusunda endişeli iseniz onlar size yapılandırma dosyasında varsayılan kullanmalıdır bulunmaktadır: port: process.env.PORT || 8080.
Tony

1
Belki de bunu açıklamanın alternatif bir yolu, NODE_ENV (ve diğer ortam değişkenleri) ortamın (dolayısıyla adın) bir parçası olabilir. Bunlar genellikle uygulamanız yerine uygulamayı çalıştırdığınız sunucunun özellikleridir. Bunları yürüttüğünüz komutla manuel olarak ayarlayabilirsiniz, yani: NODE_ENV=test npm startveya kabuk tarafından ayarlanmasını sağlayabilirsiniz
Evan

3
Katılmıyorum. her ortam için bir ./config kullanmak, uygulamanızı dağıtırken statik ortamları kullanmanıza olanak sağlar. Bu, gerektiğinde yeni ortam türlerini döndürmenize izin vermeyecek eski bir felsefedir. IE istediğiniz her yeni ortam için bir .config eklemeniz gerekecektir. Çalışma yerinizde ortam değişkenlerini ayarlamak, teknoloji yığınınız daha fazla esneklik gerektirdiğinde üstün bir seçenek olabilir. Sanırım ./config ortamınızın "türlerini" ayarlamak için iyi olurdu, ancak çalışma zamanında dsn dizeleri ve api uç noktaları gibi şeyleri tanımlayabilirseniz uygulamanız daha esnek olacaktır.
Jesse Greathouse

@JesseGreathouse - Bir node.js uygulamam var ve çalışma zamanında ortam değişkenlerini ayarlamam gerekiyor - bunları hangi dosyaya yerleştirirdim?
Roger Dodger

1

npm (ve iplik) package.json dosyasından çok sayıda veriyi ortam değişkenleri olarak betiklere aktarır . npm run envHepsini görmek için kullanın . Bu, https://docs.npmjs.com/misc/scripts#environment içinde belgelenmiştir ve yalnızca "yaşam döngüsü" komut dosyaları için prepublishdeğil, aynı zamanda yürüttüğü komut dosyaları için de geçerlidir npm run.

Bu iç koda erişebilirsiniz (örn process.env.npm_package_config_port. JS'de), ancak komut dosyalarını çalıştıran kabuk tarafından zaten kullanılabilir, böylece $npm_..."komut dosyalarında" (unix sözdizimi, pencerelerde çalışmayabilir mi?)

"Yapılandırma" bölümü bu kullanılmak üzere tasarlanmıştır görünüyor:

  "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/"
  } 

Bu "yapılandırma" alanlarının önemli bir kalitesi, kullanıcıların package.json'u değiştirmeden bunları geçersiz kılabilmesidir .

$ 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

Bkz. Npm yapılandırma ve iplik yapılandırma belgeleri.
O iplik okur görünür ~/.npmrcböylece npm config sethem etkiler, ancak yarn config setyazar ~/.yarnrcbu yüzden sadece iplik göreceksiniz, :-(


1

@ luke'nin cevabı neredeyse ihtiyacımdı! Teşekkürler.

Seçilen cevap çok basit (ve doğru), ancak eski olduğundan, komut dosyalarınızı çalıştırırken ve Luke'un cevabına bazı sınırlamaları giderirken değişkenleri .env ayrı bir dosyadan içe aktarmak için bir alternatif sunmak istiyorum. Bunu dene:

::: .env dosyası :::

# This way, you CAN use comments in your .env files
NODE_PATH="src/"

# You can also have extra/empty lines in it
SASS_PATH="node_modules:src/styles"

Ardından, json paketinizde, değişkenleri ayarlayacak ve ihtiyacınız olan komut dosyalarından önce çalıştıracak bir komut dosyası oluşturacaksınız:

::: package.json :::

scripts: {
  "set-env": "export $(cat .env | grep \"^[^#;]\" |xargs)",
  "storybook": "npm run set-env && start-storybook -s public"
}

Bazı gözlemler:

  • Grep'ed cat komutundaki düzenli ifade, yorumları ve boş satırları temizler.

  • &&Olması gerekmez "yapışık" için npm run set-envaynı komutu değerleri ayarlama ile sağlanmaması halinde gerekli olacak.

  • İplik kullanıyorsanız, bir uyarı görebilirsiniz, onu ya değiştirebilirsiniz ya yarn set-envda kullanabilirsiniz npm run set-env --scripts-prepend-node-path &&.

Farklı ortamlar

Bunu kullanmanın bir diğer avantajı, farklı ortam değişkenlerine sahip olabilmenizdir.

scripts: {
  "set-env:production": "export $(cat .production.env | grep \"^[^#;]\" |xargs)",
  "set-env:development": "export $(cat .env | grep \"^[^#;]\" |xargs)",
}

Lütfen anahtarlarınız, parolalarınız veya mantıklı / kişisel verileriniz olduğunda git deponuza .env dosyaları eklememeyi unutmayın!


1

pencerelerde git bash kullanın. Git Bash komutları cmd'den farklı işler.

Çoğu Windows komut istemi, NODE_ENV = bunun gibi üretim ile ortam değişkenleri ayarladığınızda boğulur. (İstisna, yerel Bash kullanan Windows'ta Bash'dir.) Benzer şekilde, pencerelerin ve POSIX komutlarının ortam değişkenlerini kullanma biçiminde bir fark vardır. POSIX ile şunları kullanırsınız: $ ENV_VAR ve pencerelerde% ENV_VAR% kullanırsınız. - çapraz env doktoru

{
  ...
  "scripts": {
    "help": "tagove help",
    "start": "env NODE_ENV=production tagove start"
  }
  ...
}

env değişkenlerini bildirmek için dotenv paketini kullanın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.