Cara mengatur beberapa variabel lingkungan dari dalam package.json
untuk digunakannpm start
perintah seperti?
Inilah yang saat ini saya miliki di package.json
:
{
...
"scripts": {
"help": "tagove help",
"start": "tagove start"
}
...
}
Saya ingin mengatur variabel lingkungan (seperti NODE_ENV
) dalam skrip mulai sementara masih dapat memulai aplikasi hanya dengan satu perintah npm start
,.
node.js
npm
package.json
npm-scripts
dev.meghraj
sumber
sumber
Jawaban:
Setel variabel lingkungan dalam perintah skrip:
Kemudian gunakan
process.env.NODE_ENV
di aplikasi Anda.Catatan:
env
memastikan bahwa itu berfungsi lintas platform. Anda dapat menghilangkannya jika Anda hanya peduli dengan Mac / Linux.sumber
set NODE_ENV=test&& mocha --reporter spec
- tidak ada ruang antara tes dan && dengan sengaja."test": "NODE_ENV=test mocha --reporter spec"
tidak akan berfungsi pada sistem Windows.env NODE_ENV=test mocha --reporter spec
akan menggunakan variabel lingkungan yang dideklarasikan secara asli lintas platform, tetapi kuncinya adalah digunakan oleh npm dalam mode ad hoc dan sekali pakai, hanya untuk eksekusi skrip npm. (Ini tidak disetel atau diekspor untuk referensi di masa mendatang.) Selama Anda menjalankan perintah dari skrip npm, tidak ada masalah. Juga, "&&" harus dihapus ketika melakukannya dengan cara ini.Cukup gunakan paket NPM lintas-env . Sangat mudah. Bekerja pada Windows, Linux, dan semua lingkungan. Perhatikan bahwa Anda tidak menggunakan && untuk pindah ke tugas berikutnya. Anda cukup mengatur env dan kemudian memulai tugas berikutnya. Kredit ke @mikekidder untuk saran di salah satu komentar sini.
Dari dokumentasi:
Perhatikan bahwa jika Anda ingin mengatur beberapa global vars, Anda cukup menyatakannya secara berurutan, diikuti dengan perintah Anda untuk dieksekusi.
Pada akhirnya, perintah yang dieksekusi (menggunakan spawn) adalah:
The
NODE_ENV
variabel lingkungan akan ditetapkan oleh lintas-envsumber
"test": "cross-env TS_NODE_COMPILER_OPTIONS='{\\\"module\\\":\\\"commonjs\\\"}' mocha"
env
ataucross-env
? Di satu sisi, env tidak mengharuskan saya untuk menginstal apa pun dan di sisi laincross-env
lebih populer. Bisakah seseorang mengonfirmasi jikaenv
berfungsi di semua platform?env
tidak berfungsi apa adanya di semua platform, karenanya alasan untukcross-env
ada. Cukup gunakancross-env
dan lakukan saja.Karena saya sering menemukan diri saya bekerja dengan beberapa variabel lingkungan, saya merasa berguna untuk menyimpannya dalam
.env
file terpisah (pastikan untuk mengabaikan ini dari kontrol sumber Anda).Kemudian letakkan di
export $(cat .env | xargs) &&
depan perintah skrip Anda.Contoh:
Untuk tes Anda dapat melihat variabel env dengan menjalankan
npm run env
(linux) ataunpm run env-windows
(windows).sumber
&&
berfungsi - Jika Anda memiliki banyak file .env, mungkin akan sedikit lebih sulit untuk mempertahankan Jawaban Anda mengilhami saya untuk menyiapkan saran ini: stackoverflow.com/questions/25112510/…Saya hanya ingin menambahkan dua sen saya di sini untuk penjelajah Node di masa depan. Di Ubuntu 14.04
NODE_ENV=test
saya tidak berfungsi, saya harus menggunakanexport NODE_ENV=test
setelah ituNODE_ENV=test
mulai bekerja juga, aneh.Pada Windows seperti yang telah dikatakan Anda harus menggunakan
set NODE_ENV=test
tetapi untuk solusi lintas-platform perpustakaan cross-env tampaknya tidak melakukan trik dan apakah Anda benar-benar membutuhkan perpustakaan untuk melakukan ini:Bilah vertikal diperlukan karena jika tidak, Windows akan mogok pada
export NODE_ENV
perintah yang tidak dikenal : D. Tidak tahu tentang ruang trailing tetapi hanya untuk memastikan saya menghapusnya juga.sumber
&&
?NODE_ENV=test yadda
berarti "jalankanyadda
, tetapkanNODE_ENV
dalamyadda
variabel lingkungan.NODE_ENV=test && yadda
berarti" aturNODE_ENV
dalam lingkungan lokal, tetapi jangan ekspor, lalu jalankanyadda
. "NODE_ENV=test yadda
adalah pendekatan yang disukai.NODE_ENV=test && npm run test
atau sesuatu yang serupa. Saya membuat solusi yang lebih baik menggunakanprocess.env["NODE_ENV"] = "testing";
di dalam file testhelper.js saya.&&
Anda kehilangan variabel lingkungan Anda, pengaturan variabel lingkungan tanpa ekspor hanya bekerja pada perintah saat ini (yang bukan apa-apa). untuk menjalankan perintah dengan variabel env tanpa mengekspor u lakukan:NODE_ENV=test npm run test
. Akhirnya alasan itu berhasil setelah Anda diekspor, adalah karena variabel Anda sekarang tersedia (diekspor) di sesi, NODE_ENV Anda tanpa ekspor tidak melakukan apa-apa.Coba ini di Windows dengan mengganti
YOURENV
:sumber
tiba-tiba saya menemukan bahwa actionhero menggunakan kode berikut, yang memecahkan masalah saya dengan hanya meneruskan
--NODE_ENV=production
opsi perintah skrip mulai.saya akan sangat menghargai untuk menerima jawaban dari orang lain yang tahu cara yang lebih baik untuk mengatur variabel lingkungan dalam package.json atau skrip init atau sesuatu seperti, di mana aplikasi dibooting oleh orang lain.
sumber
Untuk variabel lingkungan yang lebih besar atau ketika Anda ingin menggunakannya kembali, Anda dapat menggunakannya
env-cmd
../.env
mengajukan:./package.json
:sumber
process.env.ENV1
mongod --dbpath ~/data/db
. Saya ingin menjalankan sesuatu sepertinpm mongodb
dan itu akan mendapatkan variabel lingkungan dbpath dan menjalankan mondodb seperti biasa ... dan .. saya ingin membaginya dengan anggota lain.Meskipun tidak secara langsung menjawab pertanyaan saya ingin membagikan ide di atas jawaban lainnya. Dari apa yang saya dapatkan masing-masing akan menawarkan beberapa tingkat kompleksitas untuk mencapai kemandirian lintas platform.
Pada skenario saya, semua yang saya inginkan, pada awalnya, untuk mengatur variabel untuk mengontrol apakah akan mengamankan server dengan otentikasi JWT (untuk tujuan pengembangan)
Setelah membaca jawaban saya memutuskan hanya untuk membuat 2 file yang berbeda, dengan otentikasi dihidupkan dan dimatikan masing-masing.
File-file tersebut hanyalah pembungkus yang memanggil file index.js asli (yang saya beri nama baru
appbootstrapper.js
):Mungkin ini bisa membantu orang lain
sumber
sumber
Ini akan berfungsi di konsol Windows :
npm run aaa
keluaran:
test
Lihat jawaban ini untuk detailnya.
sumber
set TMP=test&& npm run bbb
. Ruang sebelumnya&&
juga akan dibentuk sebagai bagian dariNODE_ENV
string itu"
.gunakan git bash di windows. Git Bash memproses perintah secara berbeda dari cmd.
Sebagian besar perintah Windows akan tersedak ketika Anda mengatur variabel lingkungan dengan NODE_ENV = produksi seperti itu. (Pengecualian adalah Bash pada Windows, yang menggunakan Bash asli.) Demikian pula, ada perbedaan dalam bagaimana perintah windows dan POSIX menggunakan variabel lingkungan. Dengan POSIX, Anda menggunakan: $ ENV_VAR dan di windows Anda menggunakan% ENV_VAR%. - cross-env doc
gunakan paket dotenv untuk mendeklarasikan variabel env
sumber
Anda seharusnya tidak mengatur variabel ENV di
package.json
. actionhero menggunakanNODE_ENV
untuk memungkinkan Anda mengubah opsi konfigurasi yang diambil dari file di./config
. Periksa file konfigurasi redis , dan lihat bagaimana NODE_ENV digunakan untuk mengubah opsi basis data diNODE_ENV=test
Jika Anda ingin menggunakan variabel ENV lain untuk mengatur sesuatu (mungkin port HTTP), Anda masih tidak perlu mengubah apa pun di
package.json
. Misalnya, jika Anda menetapkanPORT=1234
ENV dan ingin menggunakannya sebagai port HTTPNODE_ENV=production
, cukup rujuk di file konfigurasi yang relevan, yaitu:sumber
npm start
perintah. Menggunakan potongan di atas, jika Anda ingin menjalankan server Anda menggunakan port ENV itu akan:export PORT=1234; npm start
. Anda dapat menambahkan deklarasi ENV sebanyak yang Anda butuhkan, tetapi deklarasi tersebut tidak termasuk dalam file package.json. Jika Anda khawatir tentang memastikan mereka ada Anda harus menggunakan default di file konfigurasi Anda:port: process.env.PORT || 8080
.NODE_ENV=test npm start
atau mengaturnya dengan shellnpm (dan benang) melewatkan banyak data dari package.json ke dalam skrip sebagai variabel lingkungan. Gunakan
npm run env
untuk melihat semuanya. Ini didokumentasikan dalam https://docs.npmjs.com/misc/scripts#environment dan tidak hanya untuk skrip "siklus hidup" sepertiprepublish
tetapi juga skrip yang dijalankan olehnpm run
.Anda dapat mengakses kode dalam ini (misalnya
process.env.npm_package_config_port
dalam JS) tetapi sudah tersedia untuk shell yang menjalankan skrip sehingga Anda juga dapat mengaksesnya sebagai$npm_...
ekspansi dalam "skrip" (unix sintaks, mungkin tidak berfungsi di windows?).Bagian "config" tampaknya dimaksudkan untuk penggunaan ini:
Kualitas penting dari bidang "config" ini adalah bahwa pengguna dapat menimpanya tanpa mengubah package.json !
Lihat npm config dan benang config docs.
Tampaknya benang berbunyi
~/.npmrc
sehingganpm config set
mempengaruhi kedua, tetapiyarn config set
menulis untuk~/.yarnrc
, sehingga hanya benang akan melihatnya :-(sumber
Jawaban @ luke hampir yang saya butuhkan! Terima kasih.
Karena jawaban yang dipilih sangat mudah (dan benar), tetapi sudah lama, saya ingin menawarkan alternatif untuk mengimpor variabel dari file terpisah .env ketika menjalankan skrip Anda dan memperbaiki beberapa batasan pada jawaban Luke. Coba ini:
::: File .env :::
Kemudian, di paket json Anda, Anda akan membuat skrip yang akan mengatur variabel dan menjalankannya sebelum skrip yang Anda butuhkan:
::: package.json :::
Beberapa pengamatan:
Ekspresi reguler dalam perintah cat grep'ed akan menghapus komentar dan baris kosong.
The
&&
tidak perlu menjadi "terpaku" untuknpm run set-env
, karena akan diperlukan jika Anda menetapkan variabel dalam perintah yang sama.Jika Anda menggunakan benang, Anda mungkin melihat peringatan, Anda dapat mengubahnya
yarn set-env
atau menggunakannyanpm run set-env --scripts-prepend-node-path &&
.Lingkungan yang berbeda
Keuntungan lain saat menggunakannya adalah Anda dapat memiliki variabel lingkungan yang berbeda.
sumber