javascript - last - Enviando argumentos de línea de comando a script npm
npm last version (10)
Encontré esta pregunta mientras intentaba resolver mi problema con la ejecución de la secuencia de secuencia: genere el comando cli:
node_modules/.bin/sequelize seed:generate --name=user
Déjame llegar al punto. Quería tener un comando de script corto 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
"scripts: {
"seed:generate":"NODE_ENV=development node_modules/.bin/sequelize seed:generate"
}
... y aquí está un ejemplo de ejecución en la terminal para generar un archivo semilla para un usuario
> yarn seed:generate --name=user
> npm run seed:generate -- --name=user
Para tu información
yarn -v
1.6.0
npm -v
5.6.0
La parte de scripts
de mi package.json
actualmente se ve así:
"scripts": {
"start": "node ./script.js server"
}
... lo que significa que puedo ejecutar npm start
para iniciar el servidor. Hasta ahora tan bueno.
Sin embargo, me gustaría poder ejecutar algo como npm start 8080
y pasar los argumentos a script.js
(p npm start 8080
Ej. npm start 8080
=> node ./script.js server 8080
). es posible?
Esto realmente no responde a tu pregunta, pero siempre puedes usar variables de entorno:
"scripts": {
"start": "PORT=3000 node server.js"
}
Luego en su archivo server.js:
var port = process.env.PORT || 3000;
La respuesta de jakub.g es correcta, sin embargo, un ejemplo con grunt parece un poco complejo.
Así que 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 comando a un script npm:
npm run [command] [-- <args>]
Imagina que tenemos una tarea de inicio de npm en nuestro package.json para iniciar el servidor webpack dev:
"scripts": {
"start": "webpack-dev-server --port 5000"
},
npm start
esto desde la línea de comandos con npm start
Ahora si queremos pasar un puerto al script npm:
"scripts": {
"start": "webpack-dev-server --port process.env.port || 8080"
},
ejecutar esto y pasar el puerto, por ejemplo, 5000 a través de la línea de comandos sería lo siguiente:
npm start --port:5000
- Utilizando la configuración de package.json:
Como lo mencionó jakub.g , también puede configurar params en la configuración de su paquete.json
"config": {
"myPort": "5000"
}
"scripts": {
"start": "webpack-dev-server --port process.env.npm_package_config_myPort || 8080"
},
npm start
utilizará el puerto especificado en su configuración, o alternativamente puede anularlo
npm config set myPackage:myPort 3000
- Configuración de un parámetro en su script npm
Un ejemplo de leer un conjunto de variables en su script npm. En este ejemplo NODE_ENV
"scripts": {
"start:prod": "NODE_ENV=prod node server.js",
"start:dev": "NODE_ENV=dev node server.js"
},
lee NODE_ENV en server.js prod o dev
var env = process.env.NODE_ENV || ''prod''
if(env === ''dev''){
var app = require("./serverDev.js");
} else {
var app = require("./serverProd.js");
}
Por lo que veo, la gente usa scripts package.json cuando les gustaría ejecutar scripts de una forma más sencilla. Por ejemplo, para usar nodemon
que se instaló en los node_modules locales, no podemos llamar a nodemon
directamente desde el cli, pero podemos llamarlo usando ./node_modules/nodemon/nodemon.js
. Entonces, para simplificar este largo tiempo de escritura, podemos poner esto ...
... scripts: { ''start'': ''nodemon app.js'' } ...
... luego llame a npm start
para usar ''nodemon'', que tiene app.js como primer argumento.
Lo que estoy tratando de decir, si solo desea iniciar su servidor con el comando de node
, no creo que necesite usar scripts
. Escribir npm start
o node app.js
tiene el mismo esfuerzo.
Pero si desea usar nodemon
y quiere pasar un argumento dinámico, tampoco use el script
. Trate de usar 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 discusión cuando lo llamo ...
./sequlize -h /* show help */
./sequelize -m /* upgrade migration */
./sequelize -m -u /* downgrade migration */
etc ...
En este punto, usar el enlace simbólico es la mejor manera de resolverlo, pero realmente no creo que sea la mejor práctica.
También espero su opinión a mi respuesta.
Si desea pasar argumentos al medio de un script npm, en lugar de solo tenerlos agregados al final, las variables de entorno en línea parecen funcionar bien:
"scripts": {
"dev": "BABEL_ARGS=-w npm run build && cd lib/server && nodemon index.js",
"start": "npm run build && node lib/server/index.js",
"build": "mkdir -p lib && babel $BABEL_ARGS -s inline --stage 0 src -d lib",
},
Aquí, npm run dev
pasa la npm run dev
-w
watch a babel, pero npm run start
solo ejecuta una compilación regular una vez.
También podrías hacer eso:
En package.json
:
"scripts": {
"cool": "./cool.js"
}
En cool.js
:
console.log({ myVar: process.env.npm_config_myVar });
En CLI:
npm --myVar=something run-script cool
Debe salir:
{ myVar: ''something'' }
Actualización: al utilizar npm 3.10.3, parece que hace minúsculas las variables process.env.npm_config_
? También estoy usando better-npm-run
, así que no estoy seguro si este es un comportamiento predeterminado de vainilla o no, pero esta respuesta está funcionando. En lugar de process.env.npm_config_myVar
, intente process.env.npm_config_myvar
Use process.argv
en su código y luego proporcione un $*
final a su entrada de valor de scripts.
echoargs.js:
console.log(''arguments: '' + process.argv.slice(2));
paquete.json:
"scripts": {
"start": "node echoargs.js $*"
}
Ejemplos:
> npm start 1 2 3
arguments: 1,2,3
process.argv[0]
es el ejecutable (nodo), process.argv[1]
es su script.
Probado con npm v5.3.0 y nodo v8.4.0
npm 2.x soporte cli args
Mando
npm run-script start -- --foo=3
Paquete.json
"start": "node ./index.js"
Index.js
console.log(''process.argv'', process.argv);
npm start 8080
ser capaz de ejecutar algo como npm start 8080
. Esto es posible sin necesidad de modificar script.js
o archivos de configuración de la siguiente manera.
Por ejemplo, en su valor JSON de "scripts"
, incluya--
"start": "node ./script.js server $PORT"
Y luego desde la línea de comandos:
$ PORT=8080 npm start
He confirmado que esto funciona con bash y npm 1.4.23. Tenga en cuenta que esta solución no requiere que se resuelva el problema n. ° 3494 de GitHub npm.
Edición 2014.10.30: es posible pasar args 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 comando npm
y los parámetros pasados a su script.
Así que 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 es mejor usar una biblioteca de análisis como yargs o minimist ; nodejs expone process.argv
globalmente, que contiene valores de parámetros de línea de comando, pero se trata de una API de bajo nivel (una matriz de cadenas separadas por espacios en blanco, según lo proporciona el sistema operativo al nodo ejecutable).
Editar 2013.10.03: Actualmente no es posible directamente. Pero hay un problema relacionado con GitHub abierto en npm
para implementar el comportamiento que estás pidiendo.Parece que el consenso es tener esto implementado, pero depende de otro problema que se haya resuelto antes.
Respuesta original: como una solución alternativa (aunque no muy práctica), puede hacer lo siguiente:
Diga que el nombre de su paquete de package.json
es myPackage
y usted también tiene
"scripts": {
"start": "node ./script.js server"
}
Luego agregue en 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, de forma predeterminada, npm start
utilizará 8080. Sin embargo, puede configurarlo ( npm
almacenará el npm
en su almacenamiento interno):
npm config set myPackage:myPort 9090
Luego, al invocar el npm start
, se utilizará 9090 (el valor predeterminado de package.json
se invalida).