Indagamos en distintos espacios para así regalarte la respuesta a tu inquietud, si continúas con preguntas puedes dejarnos tu inquietud y respondemos sin falta, porque estamos para ayudarte.
Solución:
npm 2 y posteriores
Es posible pasar argumentos a npm run
desde npm 2 (2014). La sintaxis es la siguiente:
npm run
Nota la --
separador, utilizado para separar los parámetros pasados a npm
comando en sí mismo, y los parámetros pasados a su secuencia de comandos.
con el ejemplo package.json
:
"scripts":
"grunt": "grunt",
"server": "node server.js"
aquí se explica cómo pasar los parámetros a esos scripts:
npm run grunt -- task:target // invokes `grunt task:target`
npm run server -- --port=1337 // invokes `node server.js --port=1337`
Nota: Si su parámetro no comienza con -
o --
entonces teniendo un explícito --
no se necesita separador; pero es mejor hacerlo de todos modos para mayor claridad.
npm run grunt task:target // invokes `grunt task:target`
Tenga en cuenta a continuación la diferencia en el comportamiento (test.js
posee console.log(process.argv)
): los parámetros que comienzan con -
o --
se pasan a npm
y no al guiony son tragados en silencio allí.
$ npm run test foobar
['C:\Program Files\nodejs\node.exe', 'C:\git\myrepo\test.js', 'foobar']
$ npm run test -foobar
['C:\Program Files\nodejs\node.exe', 'C:\git\myrepo\test.js']
$ npm run test --foobar
['C:\Program Files\nodejs\node.exe', 'C:\git\myrepo\test.js']
$ npm run test -- foobar
['C:\Program Files\nodejs\node.exe', 'C:\git\myrepo\test.js', 'foobar']
$ npm run test -- -foobar
['C:\Program Files\nodejs\node.exe', 'C:\git\myrepo\test.js', '-foobar']
$ npm run test -- --foobar
['C:\Program Files\nodejs\node.exe', 'C:\git\myrepo\test.js', '--foobar']
La diferencia es más clara cuando usas un parámetro realmente utilizado por npm:
$ npm test --help // this is disguised `npm --help test`
npm test [-- ]
aliases: tst, t
Para obtener el valor del parámetro, consulte 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, que contiene valores de parámetros de línea de comando, pero esta es una API de bajo nivel (separados por espacios en blanco array de cadenas, según lo proporcionado por el sistema operativo al ejecutable del nodo).
Editar 2013.10.03: Actualmente no es posible directamente. Pero hay un problema de GitHub relacionado abierto en npm
para implementar el comportamiento que estás pidiendo. Parece que el consenso es tener esto implementado, pero depende de que otro problema se resuelva antes.
Respuesta original (2013.01): Como una especie de solución alternativa (aunque no muy útil), puede hacer lo siguiente:
Di el nombre de tu paquete de package.json
es myPackage
y tu tambien tienes
"scripts":
"start": "node ./script.js server"
Luego agrega 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 será almacenado por npm
en su almacenamiento interno):
npm config set myPackage:myPort 9090
Entonces, al invocar npm start
se utilizará 9090 (el valor predeterminado de package.json
se anula).
Usted pidió ser capaz de ejecutar algo me gustanpm start 8080
. Esto es posible sin necesidad de modificar script.js
o archivos de configuración de la siguiente manera.
Por ejemplo, en su "scripts"
Valor JSON, incluir–
"start": "node ./script.js server $PORT"
Y luego desde la línea de comandos:
$ PORT=8080 npm start
He confirmado que esto funciona usando bash y npm 1.4.23. Tenga en cuenta que esta solución alternativa no requiere que se resuelva el problema npm de GitHub #3494.
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
Debería salir:
myVar: 'something'
Actualización: al usar npm 3.10.3, parece que pone en minúsculas el process.env.npm_config_
variables? yo también estoy usando better-npm-run
por lo que no estoy seguro de si este es el comportamiento predeterminado de Vanilla o no, pero esta respuesta es trabajando. En lugar de process.env.npm_config_myVar
tratar process.env.npm_config_myvar
Si te ha resultado de utilidad nuestro artículo, te agradeceríamos que lo compartas con el resto juniors y nos ayudes a extender nuestra información.