Cómo manejar argumentos de línea de comandos en scripts de Node.js

Introducción

Índice
  1. Introducción
  • Prerrequisitos
  • Uso de vectores de argumentos
  • Uso de indicadores de argumentos
  • Uso de múltiples argumentos con valores
  • Usandocommander
  • Conclusió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:

    1. 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:

    1. 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:

    1. 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:

    1. 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:

    1. npm init

    Luego, instala commander:

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

    SUSCRÍBETE A NUESTRO BOLETÍN 
    No te pierdas de nuestro contenido ni de ninguna de nuestras guías para que puedas avanzar en los juegos que más te gustan.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Subir

    Este sitio web utiliza cookies para mejorar tu experiencia mientras navegas por él. Este sitio web utiliza cookies para mejorar tu experiencia de usuario. Al continuar navegando, aceptas su uso. Mas informacion