Aprenda a crear un programa con una interfaz de línea de comandos estándar utilizando esta útil biblioteca.

Las aplicaciones CLI (Interfaz de línea de comando) son aplicaciones simplistas basadas en texto que se ejecutan en la terminal para completar tareas específicas. Las aplicaciones CLI desempeñan un papel crucial en el flujo de trabajo de casi todos los desarrolladores y profesionales de TI.

En su mayoría son herramientas de utilidad que interactúan con el sistema operativo o aplicaciones que son instalado localmente o disponible a través de Internet para realizar una tarea de acuerdo con la entrada del usuario y directivas.

Comprensión de las aplicaciones CLI

Una interfaz de línea de comandos le permite interactuar con un programa escribiendo líneas de texto. Muchos programas CLI se ejecutan de manera diferente según el comando que utilice para iniciarlos.

Por ejemplo, el programa ls muestra información del archivo y el contenido de los directorios. Podrías ejecutarlo así:

ls -l /home
instagram viewer

Este comando incluye:

  • El nombre del programa: es.
  • Una opción (o bandera). En este caso, -l es una opción que es la abreviatura de "largo" y produce información más detallada.
  • Un argumento, /home. Aquí, el argumento especifica una ruta al directorio para mostrar información.

Si bien cada programa puede definir su propia interfaz de línea de comandos, ciertos elementos son comunes y de uso amplio. Debe seguir estos estándares para que alguien que esté familiarizado con la interfaz de línea de comandos pueda utilizar sus programas fácilmente.

¿Qué es Commander.js?

Commander.js es un paquete que le permite crear aplicaciones CLI en Node.js. Tiene una rica biblioteca de características que le permiten crear una aplicación CLI estándar, realizando gran parte del trabajo pesado. Solo tiene que definir comandos, opciones y funcionalidades para su aplicación CLI.

Combinándolo con otros paquetes como Chalk.js para diseñar, puede crear rápidamente una aplicación CLI completamente funcional en Node.js.

Creación de una aplicación CLI en Node.js usando Commander.js

Considere una aplicación CLI de ejemplo, clima urbano, que busca el significado de palabras y abreviaturas de redes sociales de el diccionario urbano. Aprenderá cómo crear la CLI y publicarla en el mpn registro de paquetes para que otros puedan instalarlo.

Cree una nueva carpeta e inicialice un nuevo proyecto de Node.js con los siguientes comandos:

mkdir urbanary-cli
cd urbanary-cli
npm init -y

Esta CLI utilizará Axios para enviar solicitudes HTTP a la API del Diccionario Urbano. Puedes usar API rápida para comprobar los puntos finales y ver las credenciales.

Una CLI simple con un subcomando y ayuda

Para comenzar a construir su CLI, instale Commander y Axios con el siguiente comando:

npm install commander axios

Crear una nueva carpeta, papelera, en el directorio de su proyecto y un nuevo archivo vacío, index.js:

mkdir bin
cd bin
touch index.js

El papelera (abreviatura de "binario") es importante porque contiene el archivo de punto de entrada que Node llama cuando ejecuta su CLI. El index.js El archivo es este archivo de punto de entrada. Ahora, edite el archivo index.js y comience a crear su CLI con la API Commander.js.

Primero, importe el programa objeto del comandante:

const { program } = require('commander');

Usarás el programa objeto para definir la interfaz de su programa, incluidos subcomandos, opciones y argumentos. El objeto tiene métodos correspondientes para cada uno de estos; por ejemplo, para definir un subcomando, utilice el dominio método.

Definir un encontrar subcomando para que la CLI busque palabras en Urban Dictionary y agregue una descripción usando el siguiente código:

// index.js
program
.command('find ')
.description('find meaning of a word or abbreviation or slang')

Esto registra un encontrar comando, que espera una palabra después y una descripción de la misma. El uso de corchetes angulares significa que la palabra es un argumento obligatorio; utilice corchetes en su lugar ([]) para que sea opcional.

Debe agregar una descripción porque Commander.js la usa para generar texto de ayuda. Cuando ejecuta la aplicación con el ayuda comando, obtendrá una guía de uso estándar.

Para probar esto, agregue lo siguiente:

program.parse()

Luego ejecuta el programa y pásale el ayuda comando para obtener el siguiente resultado:

Así es como cualquier aplicación CLI estándar mostrará su ayuda a los usuarios y, con Commander, no tendrá que preocuparse por crearla usted mismo. El -h y --ayuda Las opciones son útiles para consultar la guía de uso de un comando.

Definición de opciones y preparación del programa final

También define una opción encadenando el opción método a la definición del comando.

A continuación se explica cómo definir una opción para incluir ejemplos en las definiciones de palabras:

program.option('-e, --example', "Display examples")

Y aquí se explica cómo definir una opción que especifique la cantidad de definiciones que se devolverán:

program.option(
'-c, --count [amount]',
'amount of definitions to display (max is 10)'
)

El opción El método acepta dos parámetros de cadena, uno para el nombre de la opción (tanto en formato corto como largo) y el otro para su descripción. El extra [cantidad] argumento en el contar La opción es el valor del número de definiciones que se mostrarán.

Ahora, el último método a agregar es el acción método. Implementarás el encontrar funcionalidad del comando dentro de este método. Agréguelo a la cadena para que su código ahora se vea así:

program
.command('find ')
.description('find meaning of a word or abbreviation or slang')
.option('-e, --example', "Display examples")
.option(
'-c, --count [amount]',
'amount of definitions to display (max is 10)'
)
.action(async (word, options) => {});

Con esta configuración, esto es lo que significa un comando para obtener tres definiciones de jajaja con ejemplos se verá así:

urbanary-cli find lol -e -c 3

O, usando la forma larga de cada opción:

urbanary-cli find lol --example --count 3

Verificar Página npm del comandante para obtener más información sobre él y cómo adaptar sus funciones para sus diferentes casos de uso.

Implementación de la funcionalidad del programa

Primero, importe Axios a su index.js archivo de la siguiente manera:

const axios = require('axios');

Luego, en el cuerpo funcional de acción, puede implementar la lógica para realizar solicitudes a Urban Dictionary y mostrar los resultados de acuerdo con sus opciones.

Comience por definir su solicitud:

let requestOptions = {
method: 'GET',
URL: "https://mashape-community-urban-dictionary.p.rapidapi.com/define",
params: { term: word },
headers: {
'X-RapidAPI-Key': YOUR_RAPID_API_KEY,
'X-RapidAPI-Host': 'mashape-community-urban-dictionary.p.rapidapi.com'
}
}

Luego realiza la solicitud a la API usando Axios con el siguiente código:

try {
let resp = await axios.request(requestOptions);
console.log(`Definitions for ${word} fetched`);
wordData = resp.data.list;
} catch (err) {
console.error(err.message)
}

La única propiedad que necesita de los datos de respuesta es la lista propiedad que contiene definiciones y ejemplos.

Todavía en el intentar bloque, agregue esta lógica para manejar las opciones y mostrar los resultados de la siguiente manera:

if (options.example && options.count) {
let cnt = 1;
let definitions = wordData.slice(0, options.count);

definitions.forEach((elem) => {
console.log(`Definition ${cnt++}: ${elem.definition}`);
console.log(`Example:\n${elem.example}\n`);
});
} elseif (options.count && !options.example) {
let cnt = 1;
let definitions = wordData.slice(0, options.count);

definitions.forEach((elem) => {
console.log(`Definition ${cnt++}: ${elem.definition}`);
});
} elseif (options.example) {
console.log(`Definition: ${wordData[0].definition}`);
console.log(`Example:\n${wordData[0].example}`);
} else {
console.log(`Definition: ${wordData[0].definition}`);
}

Este código evalúa los argumentos del comando utilizando declaraciones if-else para determinar cómo mostrar la salida. Si el ejemplo y contar Se pasan opciones, se itera a través de palabraDatos e imprime el número especificado de definiciones y ejemplos con ellos.

Si pasas solo contar, muestra esa cantidad de definiciones sin ejemplos. Si pasas solo ejemplo, muestra una definición con una oración de ejemplo. El demás La declaración es el comportamiento predeterminado para imprimir solo la definición si no pasa ninguna opción.

La aplicación ya está lista, por lo que el siguiente paso es hacerla ejecutable. Comience agregando una línea shebang al principio de su archivo bin/index.js para que pueda ejecutarlo como un script independiente:

#!/usr/bin/env node

A continuación, abre tu paquete.json archivo, edite el valor del principal propiedad y agregue una papelera propiedad después de esto así:

"main": "./bin/index.js",
"bin": {
"urbanary-cli": "./bin/index.js"
},

La clave cli-urbano, bajo papelera es el comando que ingresará en su terminal para ejecutar su aplicación. Por lo tanto, asegúrese de utilizar un nombre apropiado cuando cree sus aplicaciones de línea de comandos.

Correr instalación npm -g para instalar la aplicación globalmente y podrá ejecutar la aplicación como un comando desde su terminal.

La siguiente imagen muestra el proceso de instalación y un comando de prueba para encontrar el significado de lmk:

También puede publicarlo en el registro del paquete npm ejecutando publicar NPM en la terminal dentro del directorio del proyecto. Esto lo hace instalable por cualquier persona desde cualquier lugar usando instalación npm.

Es más fácil crear y publicar su aplicación con Node.js, en comparación con cuando construir CLI con tecnologías como Rust.

Cree aplicaciones CLI funcionales con Node.js

Ya sea que esté trabajando en un paquete npm y necesite una utilidad CLI que lo acompañe, o simplemente desee crear una herramienta para mejorar su flujo de trabajo como desarrollador. Tienes todo lo que necesitas para hacer realidad tu idea con el paquete Node.js Commander.

También puede ir más allá utilizando otras bibliotecas para crear experiencias CLI mejoradas para sus aplicaciones; Node.js es lo suficientemente sólido como para cumplir sus propósitos sin muchos problemas.