Sunting 2014.10.30: Dimungkinkan untuk meneruskan argumen hingga npm run
pada npm 2.0.0
Sintaksnya adalah sebagai berikut:
npm run <command> [-- <args>]
Perhatikan yang perlu --
. Diperlukan untuk memisahkan params yang diteruskan ke npm
perintah itu sendiri dan params diteruskan ke skrip Anda.
Jadi, jika Anda memiliki package.json
"scripts": {
"grunt": "grunt",
"server": "node server.js"
}
Maka perintah berikut akan setara:
grunt task:target
=> npm run grunt -- task:target
node server.js --port=1337
=> npm run server -- --port=1337
Untuk mendapatkan nilai parameter, lihat pertanyaan ini . Untuk membaca parameter bernama, mungkin lebih baik menggunakan parsing library seperti yargs atau minimalis ; nodejs mengekspos process.argv
secara global, berisi nilai-nilai parameter baris perintah, tetapi ini adalah API tingkat rendah (array string yang dipisahkan spasi, seperti yang disediakan oleh sistem operasi ke node yang dapat dieksekusi).
Sunting 2013.10.03: Saat ini tidak mungkin secara langsung. Tapi ada masalah GitHubnpm
terkait yang dibuka untuk menerapkan perilaku yang Anda minta. Tampaknya konsensus adalah untuk menerapkan ini, tetapi itu tergantung pada masalah lain yang dipecahkan sebelumnya.
Jawaban asli: Sebagai semacam solusi (meskipun tidak terlalu praktis), Anda dapat melakukan hal berikut:
Ucapkan nama paket Anda dari package.json
is myPackage
dan Anda juga
"scripts": {
"start": "node ./script.js server"
}
Kemudian tambahkan package.json
:
"config": {
"myPort": "8080"
}
Dan di dalam kamu script.js
:
// defaulting to 8080 in case if script invoked not via "npm run-script" but directly
var port = process.env.npm_package_config_myPort || 8080
Dengan begitu, secara default npm start
akan menggunakan 8080. Namun Anda dapat mengkonfigurasinya (nilainya akan disimpan npm
di penyimpanan internal):
npm config set myPackage:myPort 9090
Kemudian, ketika menjalankan npm start
, 9090 akan digunakan (default dari package.json
akan ditimpa).
yargs
; semua parameter setelah--
dapat diuraikan dengan sempurna di skrip Anda.-- --args
omong kosong suci itu aneh tapi okeAnda diminta untuk dapat menjalankan sesuatu seperti
npm start 8080
. Ini dimungkinkan tanpa perlu memodifikasiscript.js
atau mengkonfigurasi file sebagai berikut.Misalnya, dalam
"scripts"
nilai JSON Anda , include--Dan kemudian dari baris perintah:
Saya telah mengkonfirmasi bahwa ini berfungsi menggunakan bash dan npm 1.4.23. Perhatikan bahwa penyelesaian ini tidak memerlukan masalah GitHub npm # 3494 untuk diselesaikan.
sumber
node ./script.js server ${PORT:-8080}
menjadikannya opsional.NODE_PORT=${PORT=8080}
(notive the equal) tetapi tidak untuk: - sintaksnode ./script.js server %PORT%
. Pertimbangkan untuk menggunakan cross-var dan cross-env .Anda juga dapat melakukannya:
Dalam
package.json
:Dalam
cool.js
:Di CLI:
Haruskah output:
Pembaruan: Menggunakan npm 3.10.3, tampaknya ini menurunkan
process.env.npm_config_
variabel? Saya juga menggunakanbetter-npm-run
, jadi saya tidak yakin apakah ini perilaku standar vanilla atau tidak, tetapi jawaban ini berfungsi. Alih-alihprocess.env.npm_config_myVar
, cobaprocess.env.npm_config_myvar
sumber
process.env.npm_config_myVar
mengembalikan true, bukan nilai.Jawaban jakub.g benar, namun contoh menggunakan grunt tampaknya agak rumit.
Jadi jawaban saya yang lebih sederhana:
- Mengirim argumen baris perintah ke skrip npm
Sintaks untuk mengirim argumen baris perintah ke skrip npm:
Bayangkan kita memiliki tugas awal npm di package.json kita untuk memulai server dev webpack:
Kami menjalankan ini dari baris perintah dengan
npm start
Sekarang jika kita ingin mengirimkan port ke skrip npm:
menjalankan ini dan melewati port eg 5000 melalui command line adalah sebagai berikut:
- Menggunakan package.json config:
Seperti yang disebutkan oleh jakub.g , Anda dapat mengatur params di konfigurasi package.json Anda
npm start
akan menggunakan port yang ditentukan dalam konfigurasi Anda, atau Anda dapat menimpanya- Mengatur param di skrip npm Anda
Contoh membaca set variabel dalam skrip npm Anda. Dalam contoh ini
NODE_ENV
baca NODE_ENV di server.js baik prod atau dev
sumber
"start:prod": "NODE_ENV=prod node server.js"
dalampackage.json
tidak akan berfungsi pada Windows, kecuali jika Anda menggunakan cross-env"start": "webpack-dev-server --port process.env.npm_package_config_myPort || 8080" },
harus"start": "webpack-dev-server --port $npm_package_config_myPort || 8080" },
sesuai dengan penggunaan saya dijelaskan oleh tutorial ini . Proses ref dapat digunakan dalam javascript tampaknya.npm 2.x mendukung cli args
Perintah
npm run-script start -- --foo=3
Package.json
"start": "node ./index.js"
Index.js
console.log('process.argv', process.argv);
sumber
Gunakan
process.argv
dalam kode Anda lalu berikan jejak$*
untuk entri nilai skrip Anda.Sebagai contoh, cobalah dengan skrip sederhana yang hanya mencatat argumen yang disediakan ke standar
echoargs.js
:package.json:
Contoh:
process.argv[0]
adalah executable (node),process.argv[1]
adalah skrip Anda.Diuji dengan npm v5.3.0 dan node v8.4.0
sumber
--
argumen, misalnya -npm run demo.js --skip
, itu berfungsi jika ditambahkan ekstra--
, misalnya -npm run demo.js -- --skip
echoargs.js
file skrip yang terpisah ?adb
untuk mendorong.db
file ke emulator Android dan menerima param untuk jalur lokal.db
file untuk mendorongnya, yang merupakan parameter pertamaadb push
. Sesuatu seperti ini:"db:push": "adb push process.argv.slice(2) /data/data/com.cntral.app/databases/database.db"
dan saya ingin menyebutnyanpm run db:push /Users/joshuapinter/Downloads/updated.db
. Adakah pikiran?Jika Anda ingin meneruskan argumen ke tengah skrip npm, bukan hanya menambahkannya ke akhir, maka variabel lingkungan inline tampaknya berfungsi dengan baik:
Di sini,
npm run dev
melewati-w
bendera arloji ke babel, tetapinpm run start
hanya menjalankan bangunan biasa sekali.sumber
npm run dev
,npm start
Saya telah menggunakan one-liner ini di masa lalu, dan setelah sedikit waktu dari Node.js harus mencoba dan menemukan kembali baru-baru ini. Mirip dengan solusi yang disebutkan oleh @francoisrv, ia menggunakan
node_config_*
variabel.Buat
package.json
file minimal berikut :Jalankan perintah berikut:
Perhatikan output berikut:
Semua ini didokumentasikan dengan baik dalam dokumentasi resmi npm:
Catatan: Judul Variabel Lingkungan menjelaskan bahwa variabel di dalam skrip berperilaku berbeda dengan apa yang didefinisikan dalam dokumentasi. Ini benar ketika datang ke sensitivitas kasus , serta apakah argumen didefinisikan dengan spasi atau sama dengan tanda .
Catatan: Jika Anda menggunakan argumen dengan tanda hubung, ini akan diganti dengan garis bawah pada variabel lingkungan yang sesuai. Misalnya,
npm run example --foo-bar=baz
akan sesuai dengan${npm_config_foo_bar}
.Catatan: Untuk pengguna Windows non-WSL, lihat komentar @ Doctor Blue di bawah ini ... TL; DR ganti
${npm_config_foo}
dengan%npm_config_foo%
.sumber
npm run argument --foo=bar
), tetapi variabel tidak diganti:"The value of --foo is '${npm_config_foo}'"
. Berjalan di Windows 10 jika itu penting, dengan NPM versi 6.9.0.%npm_config_foo%
sebagai gantinya. Baris perintah Windows murni / PowerShell di sini. (Tidak punya pilihan juga.)Ini tidak benar-benar menjawab pertanyaan Anda tetapi Anda selalu dapat menggunakan variabel lingkungan sebagai gantinya:
Kemudian di file server.js Anda:
sumber
Sebagian besar jawaban di atas mencakup hanya meneruskan argumen ke skrip NodeJS Anda, yang dipanggil oleh npm. Solusi saya adalah untuk penggunaan umum.
Hanya membungkus skrip npm dengan interpreter shell (mis.
sh
) Panggilan dan meneruskan argumen seperti biasa. Satu-satunya pengecualian adalah nomor argumen pertama adalah0
.Misalnya, Anda ingin menambahkan skrip npm
someprogram --env=<argument_1>
, di manasomeprogram
hanya mencetak nilaienv
argumen:package.json
Ketika Anda menjalankannya:
sumber
Dari apa yang saya lihat, orang menggunakan skrip package.json ketika mereka ingin menjalankan skrip dengan cara yang lebih sederhana. Sebagai contoh, untuk menggunakan
nodemon
yang diinstal pada node_modules lokal, kita tidak dapat memanggilnodemon
langsung dari cli, tetapi kita dapat menyebutnya dengan menggunakan./node_modules/nodemon/nodemon.js
. Jadi, untuk menyederhanakan mengetik panjang ini, kita dapat menempatkan ini ...... lalu panggil
npm start
untuk menggunakan 'nodemon' yang memiliki app.js sebagai argumen pertama.Apa yang saya coba katakan, jika Anda hanya ingin memulai server Anda dengan
node
perintah, saya tidak berpikir Anda perlu menggunakanscripts
. Mengetiknpm start
ataunode app.js
memiliki usaha yang sama.Tetapi jika Anda ingin menggunakan
nodemon
, dan ingin memberikan argumen yang dinamis, jangan gunakanscript
keduanya. Coba gunakan symlink saja.Misalnya menggunakan migrasi dengan
sequelize
. Saya membuat symlink ...ln -s node_modules/sequelize/bin/sequelize sequelize
... Dan saya bisa memberikan argumen ketika saya menyebutnya ...
dll ...
Pada titik ini, menggunakan symlink adalah cara terbaik yang bisa saya pikirkan, tetapi saya tidak benar-benar berpikir itu adalah praktik terbaik.
Saya juga berharap pendapat Anda untuk jawaban saya.
sumber
Catatan: Pendekatan ini mengubah Anda
package.json
dengan cepat, gunakan jika Anda tidak memiliki alternatif.Saya harus meneruskan argumen baris perintah ke skrip saya yang kira-kira seperti:
Jadi, ini berarti saya memulai aplikasi saya dengan
npm run start
.Sekarang jika saya ingin memberikan beberapa argumen, saya akan mulai dengan mungkin:
Apa yang dilakukan adalah:
npm run build && npm run watch -- --config=someConfig
. Masalah dengan ini adalah, selalu menambahkan argumen di akhir skrip. Ini berarti semua skrip dirantai tidak mendapatkan argumen ini (Args mungkin atau mungkin tidak diperlukan oleh semua, tapi itu cerita yang berbeda.). Lebih jauh ketika skrip yang terhubung dipanggil maka skrip tersebut tidak akan mendapatkan argumen yang diteruskan. yaituwatch
skrip tidak akan mendapatkan argumen yang lulus.Penggunaan produksi aplikasi saya adalah sebagai
.exe
, jadi melewati argumen di exe berfungsi dengan baik tetapi jika ingin melakukan ini selama pengembangan, itu akan bermasalah.Saya tidak dapat menemukan cara yang tepat untuk mencapai ini, jadi inilah yang saya coba.
Saya telah membuat file javascript:
start-script.js
pada tingkat induk aplikasi, saya memiliki "default.package.json" dan alih-alih mempertahankan "package.json", saya memelihara "default.package.json". Tujuannyastart-script.json
adalah membacadefault.package.json
, mengekstrak,scripts
dan mencarinpm run scriptname
lalu menambahkan argumen yang lolos ke skrip ini. Setelah ini, itu akan membuat yang barupackage.json
dan menyalin data dari default.package.json dengan skrip yang dimodifikasi dan kemudian memanggilnpm run start
.Sekarang, alih-alih melakukan
npm run start
, saya lakukannode start-script.js --c=somethis --r=somethingElse
Proses awal terlihat baik-baik saja, tetapi belum diuji secara menyeluruh. Gunakan itu, jika Anda suka untuk pengembangan aplikasi Anda.
sumber
Saya telah menemukan pertanyaan ini ketika saya mencoba untuk menyelesaikan masalah saya dengan menjalankan sequelize seed: menghasilkan perintah cli:
Biarkan saya langsung ke intinya. Saya ingin memiliki perintah skrip pendek dalam file package.json saya dan untuk memberikan argumen --name pada saat yang sama
Jawabannya muncul setelah beberapa percobaan. Ini adalah perintah saya di package.json
... dan di sini adalah contoh menjalankannya di terminal untuk menghasilkan file seed untuk pengguna
FYI
sumber
-- --arg1, ...
?npm run script_target - <argumen> Pada dasarnya ini adalah cara meneruskan argumen baris perintah tetapi itu akan bekerja hanya dalam kasus ketika skrip hanya memiliki satu perintah yang berjalan seperti saya menjalankan perintah yaitu npm run start - 4200
Ini akan berjalan untuk melewati parameter baris perintah tetapi bagaimana jika kita menjalankan lebih dari satu perintah bersama seperti npm run build c: / workspace / file
tapi itu akan juru bahasa seperti ini saat menjalankan copy c: / file && ng build c: / ruang kerja / file dan kita diharapkan sesuatu seperti copy ini c: / file c: / ruang kerja / file && ng build
Catatan: - jadi parameter baris perintah hanya berfungsi iklan yang diharapkan jika hanya satu perintah dalam skrip.
Saya membaca beberapa jawaban di atas di mana beberapa dari mereka menulis bahwa Anda dapat mengakses parameter baris perintah menggunakan $ simbol tetapi ini tidak akan berhasil
sumber
Saya tahu sudah ada jawaban yang disetujui, tapi saya agak suka pendekatan JSON ini.
Biasanya saya punya 1 var yang saya butuhkan, seperti nama proyek, jadi saya menemukan ini cepat dan sederhana.
Juga saya sering memiliki sesuatu seperti ini di package.json saya
Dan menjadi serakah saya ingin "semuanya", NODE_ENV dan hal-hal garis CMD arg.
Anda cukup mengakses hal-hal ini seperti di file Anda (dalam kasus saya local.js)
Anda hanya perlu memiliki bit ini di atasnya (saya menjalankan v10.16.0 btw)
Anyhoo, pertanyaan sudah dijawab. Kupikir aku akan berbagi, karena aku banyak menggunakan metode ini.
sumber