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 commander
paquete.
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, npm
v7.12.2 y commander
v7.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.argv
en 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 node
ejecutable 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 length
de 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 length
longitud de argv
. Una longitud de 2
indicaría que solo node
está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 2
debe a que las matrices en JavaScript tienen un índice cero. Si hay un tercer elemento presente y es igual a , -f
se 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 indexOf
en 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 ( -nJaneDoe
o --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 commander
biblioteca puede ayudar.
commander
es 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}`);
commander
hace todo el trabajo duro procesando process.argv
y agregando los argumentos y cualquier valor asociado como propiedades en nuestro commander
objeto.
Podemos crear versiones de nuestro script fácilmente e informar el número de versión con -v
o --version
. También obtenemos una salida sencilla que explica el uso del script al pasar el --help
argumento 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 commander
paquete.
Si bien puede crear rápidamente scripts con sus propios argumentos de línea de comandos, es posible que desee considerar utilizar commander
o Inquirer.js
si desea mayor solidez y facilidad de mantenimiento.
Deja una respuesta