馃 automatizar!...
En alg煤n punto de nuestros proyectos generamos scripts, para automatizar algunos procesos, o simplemente tenemos a la mano decenas de comandos (贸 alias para ellos) que hacen despliegues, construyen sitios, generan claves aleatorias, consultan el estado del clima, la IP etc...
Y al final del d铆a, tenemos que recordar mil comandos para tareas repetitivas, y es ah铆 donde brilla Just un programa para ejecutar tareas, otros programas, un automatizador para dominarlos a todos...
Just provee una sintaxis inspirada en make, para crear las recetas, adem谩s de:
- funciones predefinidas
- uso de variables de entorno
- manipulaci贸n de strings
- manejo de rutas
- evaluaci贸n de comandos
- expresiones condicionales
- extender las recetas con scripting en Bash, Python, Ruby, NodeJS, Perl
y un largo etc茅tera de funcionalidades increibles, para la creaci贸n de recetas a tu gusto.
Ejemplo:
nombre-de-tu-receta:
echo 'Esto es una receta usando Just!'
# esto es un comentario
otra-receta:
@echo 'Esto es otra receta.'
En Just, los comandos, llamados recetas, se almacenan en un archivo llamado .justfile, con una sintaxis inspirada en make
-- un visitante del blog
Just se puede utilizar de varias maneras dependendiendo tus necesidades, sin embargo las maneras habituales son:
- De forma local, creando un archivo llamado .justfile en la raiz de tu projecto.
- De forma global, creando varias tareas de proposito general.
Just de forma local
El archivo .justfile se almacena en la raiz de tu projecto.
Veamos un ejemplo:
Creamos una receta llamada hello que acepta un par谩metro llamado guy. Esta receta, invoca a echo y le env铆a el par谩metro establecido.
# .justfile
hello guy:
@echo "Hello {{ guy }}!"
y al lanzar nuestra receta, tendremos:
$ just hello Tux
Hello Tux!
Un archivo .justfile con recetas en una carpeta de un proyecto de software, puede entre otras cosas, construir el proyecto, lanzar pruebas unitarias, construir la documentaci贸n, hacer deploy a un servidor web, etc. Las posibilidades son infinitas.
Just de forma global
para usar Just de forma global es necesario organizar un archivo, usualmente llamado .user.justfile, con nuestras recetas y alojarlo en la carpeta $HOME de nuestro Sistema Operativo.
Luego, crear un alias (recomendado) para que Just, al ser lanzado cargue ese archivo de recetas.
Ejemplo, en nuestro archivo .bashrc 贸 .zshrc agregar un nuevo alias:
alias .j='just -f ~/.tu_nombre_de_usuario.justfile --working-directory .'
Nuestro alias sera ".j" y podemos utilizarlo como:
$ .j nombre-receta
Esto aplica para cualquier receta ubicada en ~/.user.justfile.
Ejemplo:
Crearemos una receta llamada repo que acepta un par谩metro llamado folder. Esta receta, crea una carpeta e inicializa git flow.
# .your_user.justfile
current_path := invocation_directory()
# configurar un nuevo repo usando git flow
repo folder:
@echo "creando repo en {{ current_path }}/{{ folder }}"
@echo "directorio de trabajo: {{ folder }}"
@mkdir -pv {{ folder }}
@echo
@echo "iniciando git flow..."
@cd {{ folder }} && git flow init -fd
@echo
@echo "proceso completado en: {{ current_path }}/{{ folder }}"
y al lanzar nuestra receta, tendremos:
$ .j repo awesome-frontend
creando repo en /home/diniremix/dev/awesome-frontend
directorio de trabajo: awesome-frontend
mkdir: se ha creado el directorio 'awesome-frontend'
iniciando git flow...
Inicializado repositorio Git vac铆o en /home/diniremix/dev/awesome-frontend/.git/
Using default branch names.
No branches exist yet. Base branches must be created now.
Branch name for production releases: [master]
Branch name for "next release" development: [develop]
How to name your supporting branch prefixes?
Feature branches? [feature/]
Bugfix branches? [bugfix/]
Release branches? [release/]
Hotfix branches? [hotfix/]
Support branches? [support/]
Version tag prefix? []
Hooks and filters directory? [/home/diniremix/dev/awesome-frontend/.git/hooks]
proceso completado en: /home/diniremix/dev/awesome-frontend
Extendiendo Just con Scripts
En algunas ocasiones queremos ir un poco m谩s all谩 con nuestras recetas, Just provee un mecanismo sencillo para extenderlas, usando Bash, Python, y otros lenguajes de script.
Lo 煤nico que tienes que hacer, es iniciar la receta con "#!"
Ejemplo:
# .justfile
receta-python:
#!/usr/bin/env python3
print('Hola desde python!')
receta-js:
#!/usr/bin/env node
console.log('Saludos desde JavaScript!')
receta-perl:
#!/usr/bin/env perl
print "Larry Wall dice Hola!\n";
receta-sh:
#!/usr/bin/env sh
set -euxo pipefail
hello='Yo'
echo "$hello desde un shell script!"
receta-ruby:
#!/usr/bin/env ruby
puts "Hola desde ruby!"
Algunas de las recetas habituales son:
- crear una aplicacion/libreria en Rust
- crear un proyecto con Python, virtualenv y pip
- generar claves de SSH
- desplegar un backend de servicios en GAE/Heroku
- ver el clima 馃槃
- la IP actual 馃槈
- mostrar estadisticas de un proyecto, y la cantidad de lineas de c贸digo, con tokei.