mac last instalar como javascript node.js npm

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).