C’est la mode d’utiliser make (l’outil de build, pas le nouveau nom d’Integromat)
Mais… c’est un outil de build apparu en 76. C’est robuste, ca marche bien, mais ca ne réponde pas use-case qu’on essaie de lui préter − lancer des commandes.
L’idée d’origine, c’est de gérer l’arbre de compilation d’un projet. L’exemple canonique c’est un projet qui contient plusieurs fichiers .c et .h qu’on veut:
make sait gérer cet arbre de dépendances, à partir de la présence ou non des fichiers, de leurs modifications, etc.
La valeur ajoutée d’un Makefile dans plusieurs projets, c’est la documentation: on peut arriver sur un projet, et connaitre d’emblée quelques commandes utiles.
Quand on l’utilise comme task-runner, on doit cependant utiliser un peu partout des hacks:
Voici un exemple où make sert de wrapper autour des commandes de Jekyll (un générateur de sites statiques).
.PHONY: install update serve build help
.DEFAULT_GOAL := help
install: ## install the necessary dependencies
bundle install
update: ## update the dependencies
bundle update
serve: ## starts the webserver that displays the blog
# In order to display the draft, add a date line in the frontmatter:
# "date: 2021-04-22"
bundle exec jekyll serve --drafts
build: ## build the blog, details the build time and the build errors
bundle exec jekyll build --profile --trace
help:
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
Une solution élégante c’est Just. Au lieu d’un fichier Makefile, on crée un Justfile. La syntaxe est très proche. Il y a quelques avantages:
default: lint build test
# default recipe to display help information
default:
@just --list
# sans recette par défaut, la première recette est utilisée
Les commandes peuvent avoir une valeur par défaut
# Starts the webserver, by default on port 4000
serve port=4000:
bundle exec jekyll serve --port
alias s := serve
# Starts the webserver
serve:
bundle exec jekyll serve
# Set dotenv-load to True in order to load the content of
# .env as environment variables
set dotenv-load := true
test:
echo "$DATABASE_ADDRESS from .env"
D’autres infos dans la doc et une cheatsheet plus complète.