Cómo manejar argumentos de línea de comandos en scripts de Node.js
Introducción
Los argumentos de la línea de comandos son una forma de proporcionar información adicional para los comandos. Puede utilizar argumentos de la línea de comandos para agregar flexibilidad y personalización a sus scripts de Node.js.
En este artículo, aprenderá sobre vectores de argumentos, cómo detectar indicadores de argumentos, cómo manejar múltiples argumentos y valores, y cómo usar el commanderpaquete.
Prerrequisitos
Para seguir este tutorial, necesitarás:
- Un entorno de desarrollo local para Node.js. Sigue Cómo instalar Node.js y crear un entorno de desarrollo local .
Este tutorial fue verificado con Node v16.10.0, npmv7.12.2 y commanderv7.2.0.
Uso de vectores de argumentos
Node.js admite una lista de argumentos pasados, conocida como vector de argumentos . El vector de argumentos es una matriz disponible process.argven el script de Node.js.
La matriz contiene todo lo que se pasa al script, incluido el ejecutable Node.js y la ruta y el nombre de archivo del script.
Si ejecutara el siguiente comando:
- node example.js -a -b -c
Su vector de argumento contendría cinco elementos:
[ '/usr/bin/node', '/path/to/example.js', '-a', '-b', '-c']
Como mínimo, un script que se ejecuta sin ningún argumento aún contendrá dos elementos en la matriz: el nodeejecutable y el archivo de script que se está ejecutando.
Normalmente, el vector de argumentos se combina con un recuento de argumentos ( argc) que indica cuántos argumentos se han pasado. Node.js carece de esta variable en particular, pero siempre podemos obtener el lengthde la matriz de vectores de argumentos:
ejemplo.js
if (process.argv.length === 2) { console.error('Expected at least one argument!'); process.exit(1);}
Este código de ejemplo comprobará la lengthlongitud de argv. Una longitud de 2indicaría que solo nodeestán presentes el archivo ejecutable y el archivo de secuencia de comandos. Si no hay argumentos, imprimirá el mensaje: Expected at least one argument!y exit.
Uso de indicadores de argumentos
Consideremos un ejemplo que muestra un mensaje predeterminado. Sin embargo, cuando está presente una bandera específica, mostrará un mensaje diferente.
ejemplo.js
if (process.argv[2] process.argv[2] === '-f') { console.log('Flag is present.');} else { console.log('Flag is not present.');}
Este script verifica si tenemos un tercer elemento en nuestro vector de argumentos. El índice se 2debe a que las matrices en JavaScript tienen un índice cero. Si hay un tercer elemento presente y es igual a , -fse modificará el resultado.
A continuación se muestra un ejemplo de ejecución del script sin argumentos:
- node example.js
Y la salida generada:
OutputFlag is not present.
A continuación se muestra un ejemplo de ejecución del script con argumentos:
- node example.js -f
Y la salida generada:
OutputFlag is present.
No tenemos que limitarnos a modificar la estructura de control condicional, también podemos utilizar el valor real que se ha pasado al script:
ejemplo.js
const custom = (process.argv[2] || 'Default');console.log('Custom: ', custom);
En lugar de un condicional basado en el argumento, este script toma el valor que se pasa (por defecto, "Default"cuando falta el argumento) y lo inyecta en la salida del script.
Uso de múltiples argumentos con valores
Hemos escrito un script que acepta un argumento y uno que acepta un valor sin procesar, ¿qué pasa en los escenarios en los que queremos usar un valor junto con un argumento?
Para hacer las cosas un poco más complejas, aceptemos también múltiples argumentos:
ejemplo.js
// Check to see if the -f argument is presentconst flag = ( process.argv.indexOf('-f') -1 ? 'Flag is present.' : 'Flag is not present.');// Checks for --custom and if it has a valueconst customIndex = process.argv.indexOf('--custom');let customValue;if (customIndex -1) { // Retrieve the value after --custom customValue = process.argv[customIndex + 1];}const custom = (customValue || 'Default');console.log('Flag:', `${flag}`);console.log('Custom:', `${custom}`);
Al utilizar indexOfen lugar de confiar en valores de índice específicos, podemos buscar los argumentos en cualquier parte del vector de argumentos, ¡independientemente del orden!
A continuación se muestra un ejemplo de ejecución del script sin argumentos:
node example.js
Y la salida generada:
OutputFlag: Flag is not present.Custom: Default
A continuación se muestra un ejemplo de ejecución del script con argumentos:
- node example.js -f --custom Override
Y la salida generada:
OutputFlag: Flag is present.Custom: Override
Ahora, su script de línea de comandos puede aceptar múltiples argumentos y valores.
Usandocommander
Los ejemplos mencionados anteriormente funcionan cuando la entrada del argumento es bastante específica. Sin embargo, los usuarios pueden intentar usar argumentos con y sin signos de igual ( -nJaneDoeo --name=JohnDoe), cadenas entre comillas para pasar valores con espacios ( -n "Jane Doe") e incluso tener argumentos con alias para proporcionar versiones abreviadas y extensas.
Ahí es donde la commanderbiblioteca puede ayudar.
commanderes una popular biblioteca Node.js que está inspirada en la biblioteca Ruby del mismo nombre.
Primero, en el directorio de su proyecto, inicialice su proyecto:
- npm init
Luego, instala commander:
- npm install commander@7.2.0
Tomemos nuestro ejemplo anterior y portemoslo para usarlo commander:
ejemplo-commander.js
const commander = require('commander');commander .version('1.0.0', '-v, --version') .usage('[OPTIONS]...') .option('-f, --flag', 'Detects if the flag is present.') .option('-c, --custom value', 'Overwriting value.', 'Default') .parse(process.argv);const options = commander.opts();const flag = (options.flag ? 'Flag is present.' : 'Flag is not present.');console.log('Flag:', `${flag}`);console.log('Custom:', `${options.custom}`);
commanderhace todo el trabajo duro procesando process.argvy agregando los argumentos y cualquier valor asociado como propiedades en nuestro commanderobjeto.
Podemos crear versiones de nuestro script fácilmente e informar el número de versión con -vo --version. También obtenemos una salida sencilla que explica el uso del script al pasar el --helpargumento y, si pasa un argumento que no está definido o le falta un valor pasado, se generará un error.
Conclusión
En este artículo, aprendió sobre vectores de argumentos, cómo detectar indicadores de argumentos, cómo manejar múltiples argumentos y valores, y cómo usar el commanderpaquete.
Si bien puede crear rápidamente scripts con sus propios argumentos de línea de comandos, es posible que desee considerar utilizar commandero Inquirer.jssi desea mayor solidez y facilidad de mantenimiento.

Deja una respuesta