🚜 Estandarizando proyectos con Makefile
📝 Contexto
Este artículo viene de inspiración por como se trabaja en mi colaborador, ellos
usan Makefile para volver más homogéneo la multitud de repositorios que se
mantienen. A mí me ha llamado mucho la atención, ya de hace tiempo, la capacidad
de decir make setup
hace el setup en tu máquina de todo lo necesario para
montar el proyecto independientemente de ti IDE evitando así que tengas que
imitar el setup por tu cuenta. Recuerda llegar a acuerdos con tus compañeros
para nombrar los comandos, por ejemplo podemos discutir por make precommit
o
make pre-commit
etc.
😲 Ejemplo
Anteriormente, he hablado de como preparar tu setup para Python, lo bueno de este tipo de setup es que es más fácil recordar un comando que se repite para diferentes proyectos que uno por cada proyecto, además de que a veces debido al versionado necesitarás tener las instalaciones bloqueadas. Os pongo un ejemplo para Python:
PIPENV = PIPENV_IGNORE_VIRTUALENVS=1 pipenv .PHONY: setup setup: .venv/lib ## Install virtualenv dependencies @echo "✅ Setup it's done" .ONESHELL: .venv/lib: Pipfile.lock pip install -U pipenv==v2022.9.24 $(PIPENV) clean mkdir -p .venv $(PIPENV) install --dev --no-site-packages test -d .venv/lib && touch .venv/lib .ONESHELL: Pipfile.lock: Pipfile $(PIPENV) lock
En el ejemplo he separado las funciones por responsabilidad, dejando como
“pública” el setup
y las demás privadas, dándoles en mi opinión una mejor
visibilidad, además de que podemos cortar los comandos usando variables.
Llegados hasta aquí pensarás, ¿es tan maravilloso este Makefile?, en mi humilde
opinión depende de cuanta lógica tenga, a más le añadamos más engorroso se
vuelve mantenerlo y venderlo a otros equipos. Recordemos de que es una
herramienta para facilitarnos la vida, no la nueva manera de programar bash
.
🐋 Docker
Me gusta hablar de los inconvenientes que este tipo de cosas puede acarrear, como por ejemplo, se le hará muy difícil trabajar con make para desarrolladores Windows sin WSL. Otro aspecto curioso es que podemos simplificar mucho un Dockerfile gracias a este fichero, veamos un ejemplo:
FROM ubuntu:22.04 WORKDIR /app # Necessary files COPY Makefile . COPY src/ src/ # Prerequisites RUN apt-get update && apt-get install make -y # Installation RUN make setup
Mantener una forma de instalar el proyecto ayuda en gran manera al mantenimiento
del mismo, además de que encapsulas toda la lógica básica en un sitio. Esto
ayuda en gran medida al configurar un gitlab-ci.yml
, ya que lanzar
make tests
hará exactamente lo mismo con exactamente el mismo setup que las
personas que trabajan en el proyecto.
A día de hoy me gustaría siempre tener un Makefile para trabajar, me ha
sorprendido el hecho de que no son nuevos, llevan con nosotros bastantes años,
creo que es una herramienta que su función era la de gestionar dependencias o
generar automáticamente, pero el uso que se le da en este artículo nos vale
tanto para un proyecto de Java
como uno de Kotlin
, le veo mucho potencial
para suavizar la curva de entrada para nuevos miembros del equipo. Os recomiendo
echarle un ojo al
ejemplo de Python para hacer
katas.