KeiruaProd

I help my clients acquire new users and make more money with their web businesses. I have ten years of experience with SaaS projects. If that’s something you need help with, we should get in touch!
< Back to article list

Utiliser Just plutôt que Make

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:

Recette par défaut

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

Commands with parameters

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 

Aliases

alias s := serve

# Starts the webserver
serve:
    bundle exec jekyll serve

Settings from environment variables

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