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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
} |
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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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:
E agora vejam quando acionamos o comando “ola” com o parâmetro “Galera!“:
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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); |
Agora vejam em prática:
Como veio muita informação do repositório (todas) vamos filtrar e trazer só o nome, da seguinte forma:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
repos.map((repo) => { | |
console.info(repo.name); | |
}); |
Bem melhor!
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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"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:
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 😀
One thought on “Construa seu próprio CLI com Node.js”