Construa seu próprio CLI com Node.js

Fala galera! Tudo certo?

Hoje vamos fazer um negócio muito legal! Construir o nosso próprio CLI (Command Line Interface) com Node.js! Sabe aquele padrão de código que você sempre tem que fazer e precisa ficar escrevendo toda vez? Ou algo que sempre se repete? Vamos ver como otimizar o nosso tempo deixando isso automático! Bora!

O que vamos fazer?

Para demonstrar a criação de nosso CLI com Node.js, vou listar repositórios de usuários do github pela linha de comando.

Como vamos fazer?

Para fazer isso, vamos utilizar alguns pacotes do npm, são eles:

  • commander.js – É a ferramenta que vamos utilizar para realizar os comandos com Node.js;
  • request-promise – Vamos utilizar esse cara para fazer requisições HTTP para o github.

Let’s code!

Para começar, vamos criar o projeto e instalar as duas dependências; depois de criado o projeto, o nosso package.json vai ficar mais ou menos assim:


{
"name": "command-line-github-repos",
"version": "1.0.0",
"description": "Buscar repositorios do github via command line",
"dependencies": {
"commander": "^2.14.1",
"request": "^2.83.0",
"request-promise": "^4.2.2"
}
}

Show de bola! Antes de qualquer coisa, vamos fazer a requisição para a API do github e ver se está tudo como esperamos! Criei um arquivo chamado request.js para iniciarmos, o código para fazer a requisição ficou da seguinte maneira:


module.exports = {
buscarRepositoriosDo
}
const request = require('request-promise');
async function buscarRepositoriosDo(user) {
const options = {
uri: `https://api.github.com/users/${user}/repos`,
headers: {
'User-Agent': 'Request-Promise'
},
json: true
};
let repositories = await request(options);
return repositories;
}

view raw

request.js

hosted with ❤ by GitHub

Agora vamos aprender a brincar com comandos na linha de comando (que redundante), vejam como é simples, vamos criar um arquivo chamado githubhelper.js que vai ser o ponto inicial da nossa aplicação. Lá vamos referenciar o pacote do commander e começar a lançar dados na tela.

Vejam um exemplo de configuração, com um teste que retorna “Olá” concatenado com o nome que informarmos no terminal, só pra gente ir se acostumando:


const comandos = require('commander');
comandos
.version('1.0.0')
.description('Buscar repositorios do Github');
comandos
.command('ola <name>')
.alias('o')
.description('Testando')
.action(name => ola(name));
comandos.parse(process.argv);
function ola(name) {
console.info(`Olá ${name}`);
}

Se digitarmos no terminal:

node githubhelper --help

Irá aparecer no console informações sobre nossa aplicação, como definimos anteriormente, vejam:
githubhelper01

E agora vejam quando acionamos o comando “ola” com o parâmetro “Galera!“:
githubhelper02

Com isso feito ficou muito fácil né? Agora é hora de juntar tudo, e buscar os repositório de usuários do github.
Vejam o código a seguir, onde configuramos para o comando “repositorios do” seguido do nome do usuário:


const request = require('./request');
const comandos = require('commander');
comandos
.version('1.0.0')
.description('Buscar repositorios do Github');
comandos
.command('repositorios do <user>')
.alias('r')
.description('Buscar repositorios de um usuário')
.action(async (user) => {
try{
let repos = await request.buscarRepositoriosDo('vmussak');
console.info(repos);
} catch (error) {
console.error(error);
}
});
comandos.parse(process.argv);

view raw

githubhelper.js

hosted with ❤ by GitHub

Agora vejam em prática:
githubhelper03

Como veio muita informação do repositório (todas) vamos filtrar e trazer só o nome, da seguinte forma:


repos.map((repo) => {
console.info(repo.name);
});

view raw

map.js

hosted with ❤ by GitHub

Bem melhor!
githubhelper04

Já acabou?

Ainda não! agora falta convertermos a nossa aplicação em um comando shell, que pode ser feito da seguinte maneira:

Adicionamos o seguinte texto na primeira linha do arquivo “githubhelper.js“:

#!/usr/bin/env node

Assim estamos “ensinando” ao shell a maneira de executar o nosso aplicativo.

E depois, alteramos o arquivo “package.json” para ficar da seguinte maneira:


{
"name": "command-line-github-repos",
"version": "1.0.0",
"description": "Buscar repositorios do github via command line",
"dependencies": {
"commander": "^2.14.1",
"request": "^2.83.0",
"request-promise": "^4.2.2"
},
"preferGlobal": true,
"bin": {
"ginit": "./githubhelper.js"
}
}

Vejam que definimos o atributo “preferGlobal” como true, que basicamente diz que nosso pacote é instalável preferencialmente como global. E no atributo “bin” mapeamos qual arquivo deve ser o inicial ao executarmos o aplicativo.

Feito isso, basta executarmos o comando:

npm link

Isso faz com que seja gerado um link simbólico (symlink) entre o diretório do projeto e um comando executável, fazendo dele um pacote global.

Agora para executarmos o nosso comando, temos que utilizar o nome do projeto que está definido no package.json seguindo do comando, no nosso caso, ficaria:

 command-line-github-repos repositorios do vmussak

Certifique-se de executar o comando em uma pasta diferente da que criou o projeto 😀 (só pra ter certeza mesmo rsrsrs)

Vejam:
githubhelper05

De boas né?

Os exemplos de código estão disponíveis no GitHub: https://github.com/vmussak/command-line-github-repos

Por hoje é só, qualquer dúvida ou sugestão, estou à disposição! Até mais 😀

Advertisement

One thought on “Construa seu próprio CLI com Node.js

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão /  Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão /  Alterar )

Connecting to %s