Editar 2014.10.30: es posible pasar argumentos a npm run
partir de npm 2.0.0
La sintaxis es la siguiente:
npm run <command> [-- <args>]
Tenga en cuenta lo necesario --
. Es necesario separar los parámetros pasados al npm
comando en sí y los parámetros pasados a su script.
Entonces si tienes en package.json
"scripts": {
"grunt": "grunt",
"server": "node server.js"
}
Entonces los siguientes comandos serían equivalentes:
grunt task:target
=> npm run grunt -- task:target
node server.js --port=1337
=> npm run server -- --port=1337
Para obtener el valor del parámetro, vea esta pregunta . Para leer parámetros con nombre, probablemente sea mejor usar una biblioteca de análisis como yargs o minimist ; nodejs expone process.argv
globalmente, conteniendo valores de parámetros de línea de comando, pero esta es una API de bajo nivel (matriz de cadenas separadas por espacios en blanco, según lo proporcionado por el sistema operativo al ejecutable del nodo).
Editar 2013.10.03: Actualmente no es posible directamente. Pero hay un problemanpm
relacionado con GitHub abierto para implementar el comportamiento que está solicitando. Parece que el consenso es tener esto implementado, pero depende de que otro problema se resuelva antes.
Respuesta original: como una solución alternativa (aunque no muy útil), puede hacer lo siguiente:
Di el nombre de tu paquete de package.json
es myPackage
y también tienes
"scripts": {
"start": "node ./script.js server"
}
Luego agregue package.json
:
"config": {
"myPort": "8080"
}
Y en tu 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
De esa manera, por defecto npm start
usará 8080. Sin embargo, puede configurarlo (el valor se almacenará npm
en su almacenamiento interno):
npm config set myPackage:myPort 9090
Luego, al invocar npm start
, se usará 9090 (el valor predeterminado de package.json
se anula).
yargs
; Todos los parámetros posteriores--
se pueden analizar perfectamente en su secuencia de comandos.-- --args
Santa mierda que es raro pero está bienSolicitaste poder ejecutar algo como
npm start 8080
. Esto es posible sin necesidad de modificarscript.js
o configurar los archivos de la siguiente manera.Por ejemplo, en su
"scripts"
valor JSON, incluya--Y luego desde la línea de comandos:
He confirmado que esto funciona con bash y npm 1.4.23. Tenga en cuenta que esta solución alternativa no requiere NPM GitHub edición # 3494 que se resuelva.
fuente
node ./script.js server ${PORT:-8080}
hacerlo opcional.NODE_PORT=${PORT=8080}
(noto el igual) pero no el: - sintaxisnode ./script.js server %PORT%
. Considere usar cross-var y cross-env .También podrías hacer eso:
En
package.json
:En
cool.js
:En CLI:
Debería dar salida:
Actualización: Usando npm 3.10.3, ¿parece que minúsculas las
process.env.npm_config_
variables? También estoy usandobetter-npm-run
, así que no estoy seguro de si este es el comportamiento predeterminado de vainilla o no, pero esta respuesta está funcionando. En lugar deprocess.env.npm_config_myVar
intentarprocess.env.npm_config_myvar
fuente
process.env.npm_config_myVar
devuelve verdadero, no el valor.La respuesta de jakub.g es correcta, sin embargo, un ejemplo con grunt parece un poco complejo.
Entonces mi respuesta más simple:
- Enviar un argumento de línea de comando a un script npm
Sintaxis para enviar argumentos de línea de comandos a un script npm:
Imagine que tenemos una tarea de inicio npm en nuestro package.json para iniciar el servidor de desarrollo webpack:
Ejecutamos esto desde la línea de comando con
npm start
Ahora, si queremos pasar un puerto al script npm:
ejecutar esto y pasar el puerto, por ejemplo 5000 a través de la línea de comando, sería el siguiente:
- Usando la configuración package.json:
Como lo menciona jakub.g , también puede establecer parámetros en la configuración de su paquete.json
npm start
usará el puerto especificado en su configuración, o alternativamente puede anularlo- Establecer un parámetro en su script npm
Un ejemplo de lectura de un conjunto de variables en su script npm. En este ejemplo
NODE_ENV
leer NODE_ENV en server.js ya sea prod o dev
fuente
"start:prod": "NODE_ENV=prod node server.js"
enpackage.json
no funcionará en Windows, a menos que use cross-env"start": "webpack-dev-server --port process.env.npm_package_config_myPort || 8080" },
debe estar de"start": "webpack-dev-server --port $npm_package_config_myPort || 8080" },
acuerdo con mi uso explicado en este tutorial . El proceso de referencia puede ser usado dentro del javascript aparentemente.npm 2.x admite cli args
Mando
npm run-script start -- --foo=3
Package.json
"start": "node ./index.js"
Index.js
console.log('process.argv', process.argv);
fuente
Úselo
process.argv
en su código y luego proporcione un seguimiento$*
de la entrada de valor de sus scripts.Como ejemplo, pruébelo con un script simple que solo registra los argumentos proporcionados para estandarizar
echoargs.js
:package.json:
Ejemplos:
process.argv[0]
es el ejecutable (nodo),process.argv[1]
es tu script.Probado con npm v5.3.0 y nodo v8.4.0
fuente
--
argumentos, p. Ej.npm run demo.js --skip
, Funciona si se agrega un extra--
, p. Ej.npm run demo.js -- --skip
echoargs.js
archivo de script separado ?adb
para enviar un.db
archivo al emulador de Android y acepte un parámetro para la ruta local del.db
archivo para enviarlo, que es el primer parámetro deadb push
. Algo así:"db:push": "adb push process.argv.slice(2) /data/data/com.cntral.app/databases/database.db"
y quiero llamarlo connpm run db:push /Users/joshuapinter/Downloads/updated.db
. ¿Alguna idea?Si desea pasar argumentos al medio de un script npm, en lugar de simplemente agregarlos al final, las variables de entorno en línea parecen funcionar bien:
Aquí,
npm run dev
pasa la-w
bandera del reloj a babel, peronpm run start
solo ejecuta una compilación normal una vez.fuente
npm run dev
,npm start
Había estado usando este one-liner en el pasado, y después de un tiempo alejado de Node.js tuve que intentar redescubrirlo recientemente. Similar a la solución mencionada por @francoisrv, utiliza las
node_config_*
variables.Cree el siguiente
package.json
archivo mínimo :Ejecute el siguiente comando:
Observe el siguiente resultado:
Todo esto está bien documentado en la documentación oficial de npm:
Nota: El encabezado Variables de entorno explica que las variables dentro de los scripts se comportan de manera diferente a lo que se define en la documentación. Esto es cierto cuando se trata de mayúsculas y minúsculas , también si el argumento se define con un espacio o un signo igual .
Nota: Si está utilizando un argumento con guiones, estos serán reemplazados por guiones bajos en la variable de entorno correspondiente. Por ejemplo,
npm run example --foo-bar=baz
correspondería a${npm_config_foo_bar}
.Nota: Para usuarios de Windows que no son WSL, consulte los comentarios de @Doctor Blue a continuación ... TL; DR reemplazar
${npm_config_foo}
con%npm_config_foo%
.fuente
npm run argument --foo=bar
), pero la variable no se sustituye:"The value of --foo is '${npm_config_foo}'"
. Ejecutando en Windows 10 si eso importa, con la versión 6.9.0 de NPM.%npm_config_foo%
en su lugar. Línea de comandos de Windows pura / powershell aquí. (Tampoco tengo otra opción.)Esto realmente no responde a su pregunta, pero siempre puede usar variables de entorno:
Luego, en su archivo server.js:
fuente
La mayoría de las respuestas anteriores cubren simplemente pasar los argumentos a su script NodeJS, llamado por npm. Mi solución es para uso general.
Simplemente envuelva el script npm con una
sh
llamada de intérprete de shell (por ejemplo ) y pase los argumentos como de costumbre. La única excepción es que el primer número de argumento es0
.Por ejemplo, desea agregar el script npm
someprogram --env=<argument_1>
, dondesomeprogram
solo imprime el valor delenv
argumento:package.json
Cuando lo ejecutas:
fuente
Por lo que veo, la gente usa los scripts package.json cuando les gustaría ejecutar el script de una manera más simple. Por ejemplo, para usar
nodemon
el instalado en node_modules local, no podemos llamarnodemon
directamente desde el cli, pero podemos llamarlo usando./node_modules/nodemon/nodemon.js
. Entonces, para simplificar esta escritura larga, podemos poner esto ...... luego llame
npm start
para usar 'nodemon' que tiene app.js como primer argumento.Lo que estoy tratando de decir, si solo quieres iniciar tu servidor con el
node
comando, no creo que necesites usarloscripts
. Mecanografíanpm start
onode app.js
tiene el mismo esfuerzo.Pero si quiere usar
nodemon
, y quiere pasar un argumento dinámico, no usescript
tampoco. Intenta usar el enlace simbólico en su lugar.Por ejemplo, utilizando la migración con
sequelize
. Creo un enlace simbólico ...ln -s node_modules/sequelize/bin/sequelize sequelize
... Y puedo pasar cualquier argumento cuando lo llamo ...
etc ...
En este punto, usar el enlace simbólico es la mejor manera de entenderlo, pero realmente no creo que sea la mejor práctica.
También espero tu opinión a mi respuesta.
fuente
Nota: este enfoque modifica su
package.json
sobre la marcha, úselo si no tiene otra alternativa.Tuve que pasar argumentos de línea de comando a mis scripts que eran algo así como:
Entonces, esto significa que comienzo mi aplicación con
npm run start
.Ahora, si quiero pasar algunos argumentos, comenzaría con quizás:
Lo que esto hace es:
npm run build && npm run watch -- --config=someConfig
. El problema con esto es que siempre agrega los argumentos al final del guión. Esto significa que todos los scripts encadenados no obtienen estos argumentos (Args puede o no ser requerido por todos, pero esa es una historia diferente). Además, cuando se invocan los scripts vinculados, esos scripts no obtendrán los argumentos pasados. es decir, elwatch
script no obtendrá los argumentos pasados.El uso de producción de mi aplicación es como
.exe
, por lo que pasar los argumentos en el exe funciona bien, pero si desea hacer esto durante el desarrollo, se vuelve problamático.No pude encontrar ninguna manera adecuada de lograr esto, así que esto es lo que he intentado.
He creado un archivo javascript:
start-script.js
en el nivel primario de la aplicación, tengo un "default.package.json" y en lugar de mantener "package.json", mantengo "default.package.json". El propósito destart-script.json
es leerdefault.package.json
, extraerscripts
y buscar ynpm run scriptname
luego agregar los argumentos pasados a estos scripts. Después de esto, creará uno nuevopackage.json
y copiará los datos de default.package.json con scripts modificados y luego llamaránpm run start
.Ahora, en lugar de hacerlo
npm run start
, hagonode start-script.js --c=somethis --r=somethingElse
La ejecución inicial se ve bien, pero no se ha probado a fondo. Úselo, si lo desea para su desarrollo de aplicaciones.
fuente
Encontré esta pregunta mientras intentaba resolver mi problema con la ejecución del comando sequelize seed: generate cli:
Déjame llegar al punto. Quería tener un breve comando de script en mi archivo package.json y proporcionar el argumento --name al mismo tiempo
La respuesta vino después de algunos experimentos. Aquí está mi comando en package.json
... y aquí hay un ejemplo de cómo ejecutarlo en la terminal para generar un archivo semilla para un usuario
FYI
fuente
-- --arg1, ...
?npm run script_target - <argumento> Básicamente esta es la forma de pasar los argumentos de la línea de comando, pero funcionará solo en caso de que el script tenga un solo comando ejecutándose como si estuviera ejecutando un comando, es decir, npm run start - 4200
Esto se ejecutará para pasar los parámetros de la línea de comandos, pero ¿y si ejecutamos más de un comando juntos como npm run build c: / workspace / file?
pero interpretará de esta manera mientras ejecuta copy c: / file && ng build c: / work space / file y se espera que sea algo así como copy c: / file c: / work space / file && ng build
Nota: - por lo tanto, el parámetro de línea de comando solo funciona el anuncio esperado en el caso de un solo comando en un script.
Leí algunas respuestas anteriores en las que algunas de ellas escriben que puedes acceder al parámetro de línea de comando usando el símbolo $ pero esto no funcionará
fuente
Sé que ya hay una respuesta aprobada, pero me gusta este enfoque JSON.
Por lo general, tengo como 1 var que necesito, como el nombre de un proyecto, por lo que me parece rápido y simple.
También a menudo tengo algo como esto en mi paquete.json
Y siendo codicioso, quiero "todo", NODE_ENV y la línea arg de CMD.
Simplemente accede a estas cosas como tal en su archivo (en mi caso local.js)
Solo necesita tener este bit por encima (estoy ejecutando v10.16.0 por cierto)
Anyhoo, pregunta ya respondida. Pensé en compartir, ya que uso mucho este método.
fuente