🚜 Estandarizando proyectos con Makefile

👨‍💻 Aprendizaje
📅 2023-02-12

📝 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.