Usar o docker compose é uma maravilha, a menos que você tenha diversos projetos pra gerenciar e eles não estejam rodando nas mesmas portas, com comandos enormes e diferentes. A minha primeira ideia seria criar um Makefile mas o projeto já tem um Makefile. 🤡 Como faz então para: ter atalhos locais rodando em comandos sucintos?


O primeiro passo: criar meu próprio Makefile e chamá-lo de MyMakefile.

.PHONY: test

# pega todos os argumentos da linha de comando após o alvo
ARGS = $(wordlist 2,$(words $(MAKECMDGOALS)),$(MAKECMDGOALS))

test:
    docker-compose exec app pytest project/ --no-migrations $(ARGS)

Para que ele não seja commitado no projeto, adicionei-o no meu .gitignore global.

# ~/.gitconfig
[core]
    excludesfile = ~/.gitignore

# ~/.gitignore
MyMakefile

E agora, como faço para rodar os comandos do MyMakefile? Basta rodar o comando make -f MyMakefile. Mas esse comando é feio demais. Vamos criar um atalho para ele também. No meu .zshrc (pode ser o seu .bashrc) adicionei o seguinte alias:

alias mm='f() { make -f MyMakefile $@ }; f'

Agora sim, está cheiroso. Para rodar os testes agora eu faço:

mm test

E para passar argumentos para o comando, basta passá-los após o comando com -- - esse é o jump of the cat. Exemplo:

mm test -- --lf

Assim, ele vai rodar os testes e passar a flag --lf para o pytest (para rodar apenas os testes que falharam da última vez).

Espero que esse post tenha sido útil! A ideia foi inspirada pelo Victor Salles. Valeu, Vito!