Le cas de Makefiles in Python Projects (et comment démarrer)


# Introduction
Imaginez ceci: vous travaillez sur un projet Python, et chaque fois que vous souhaitez exécuter des tests, vous tapez python3 -m pytest tests/ --verbose --cov=src
. Lorsque vous souhaitez formater votre code, c’est black . && isort .
. Pour liner, vous courez flake8 src tests
. Avant de vous en rendre compte, vous jonglez avec une douzaine de commandes différentes, et vos coéquipiers font également la même chose légèrement différemment.
C’est là que Makefiles est utile. Utilisé à l’origine pour les projets C et C ++, les Makefiles peuvent être super utiles dans le développement de Python comme un moyen simple de normaliser et d’automatiser les tâches courantes. Considérez un Makefile comme un seul endroit où vous définissez les raccourcis pour toutes les choses que vous faites à plusieurs reprises.
# Pourquoi utiliser des makefiles dans des projets Python?
Cohérence dans votre équipe
Quand tout le monde dans votre équipe fonctionne make test
Au lieu de se souvenir de la commande Pytest exacte avec tous ses drapeaux, vous éliminez le problème « Works on My Machine ». Les nouveaux membres de l’équipe peuvent intervenir et savoir immédiatement comment exécuter des tests, coder ou déployer l’application.
Documentation qui fonctionne réellement
Contrairement aux fichiers ReadMe qui sont obsolètes, les Makefiles servent de documentation utile. Quand quelqu’un court make help
ils voient exactement quelles tâches sont disponibles et comment les utiliser.
Flux de travail complexes simplifiés
Certaines tâches nécessitent plusieurs étapes. Vous devez peut-être installer des dépendances, exécuter des migrations, des données de test de semences, puis démarrer votre serveur de développement. Avec un makefile, cela devient un seul make dev
commande.
# Commencer avec votre premier Python Makefile
Construisons étape par étape un makefile pratique. Créez un fichier nommé MakeFile (pas d’extension) dans la racine de votre projet.
// Structure de base et commande d’aide
Ce code crée un système d’aide automatique pour votre MakeFile qui affiche toutes les commandes disponibles avec leurs descriptions:
.PHONY: help
help: ## Show this help message
@echo "Available commands:"
@grep -E '^(a-zA-Z_-)+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf " 33(36m%-15s 33(0m %sn", $$1, $$2}'
.DEFAULT_GOAL := help
Le .PHONY: help
Raconte que « l’aide » n’est pas un vrai fichier mais une commande à exécuter. Lorsque vous tapez make help
il imprime d’abord « Commandes disponibles: » alors utilise une combinaison de grep
et awk
Pour scanner à travers le makefile lui-même, trouvez toutes les lignes qui ont des noms de commande suivis de ## description
et formatez-les dans une belle liste lisible avec des noms de commande et leurs explications.
// Configuration de l’environnement
Ce code crée trois commandes de gestion de l’environnement:
.PHONY: install
install: ## Install dependencies
pip install -r requirements.txt
pip install -r requirements-dev.txt
.PHONY: venv
venv: ## Create virtual environment
python3 -m venv venv
@echo "Activate with: source venv/bin/activate"
.PHONY: clean
clean: ## Clean up cache files and build artifacts
find . -type f -name "*.pyc" -delete
find . -type d -name "__pycache__" -delete
find . -type d -name "*.egg-info" -exec rm -rf {} +
rm -rf build/ dist/ .coverage htmlcov/ .pytest_cache/
Le install
La commande exécute deux fois PIP pour installer à la fois les principales dépendances et les outils de développement à partir des fichiers exigences. La commande VENV crée un nouveau dossier d’environnement virtuel Python appelé « Venv » et imprime des instructions sur la façon de l’activer.
Le clean
La commande supprime tous les fichiers désordonnés que Python crée pendant le développement. Il supprime les fichiers Python compilés (.pyc), les dossiers de cache (pycache), les répertoires d’informations sur package et construire des artefacts comme des rapports de couverture et des caches de test.
// Qualité et test du code
Cela crée des commandes de qualité de code:
.PHONY: format
format: ## Format code with black and isort
black .
isort .
.PHONY: lint
lint: ## Run linting checks
flake8 src tests
black --check .
isort --check-only .
.PHONY: test
test: ## Run tests
python -m pytest tests/ --verbose
.PHONY: test-cov
test-cov: ## Run tests with coverage
python -m pytest tests/ --verbose --cov=src --cov-report=html --cov-report=term
.PHONY: check
check: lint test ## Run all checks (lint + test)
Le format
La commande corrige automatiquement votre style de code à l’aide de Black pour le formatage et ISORT for Import Organization.
La commande Lint vérifie si votre code suit les règles de style sans rien changer. Flake8 trouve des violations de style, tandis que le noir et l’ISORT fonctionnent en mode vérification uniquement pour voir si la mise en forme est nécessaire.
Le test
La commande exécute la suite de tests. test-cov
exécute des tests et mesure également la couverture du code et génère des rapports. Le check
la commande exécute à la fois la libellur lint
et test
Commandes.
// Flux de travail de développement
Cela crée des commandes de flux de travail de développement:
.PHONY: dev
dev: install ## Set up development environment
@echo "Development environment ready!"
@echo "Run 'make serve' to start the development server"
.PHONY: serve
serve: ## Start development server
python3 -m flask run --debug
.PHONY: shell
shell: ## Start Python shell with app context
python3 -c "from src.app import create_app; app=create_app(); app.app_context().push(); import IPython; IPython.start_ipython()"
Le dev
La commande exécute d’abord le install
Commande pour configurer les dépendances, puis imprime les messages de réussite avec les étapes suivantes. Le serve
La commande démarre un serveur de développement FLASK en mode débogage.
Le shell
Commande lance un shell ipython qui est déjà connecté à votre contexte d’application FLASK, vous pouvez donc tester les requêtes de base de données et les fonctions d’application de manière interactive sans tout importer manuellement.
# Plus de techniques de mate
// En utilisant des variables
Vous pouvez définir des variables pour éviter la répétition:
PYTHON := python3
TEST_PATH := tests/
SRC_PATH := src/
.PHONY: test
test: ## Run tests
$(PYTHON) -m pytest $(TEST_PATH) --verbose
// Commandes conditionnelles
Parfois, vous voulez un comportement différent en fonction de l’environnement:
.PHONY: deploy
deploy: ## Deploy application
ifeq ($(ENV),production)
@echo "Deploying to production..."
# Production deployment commands
else
@echo "Deploying to staging..."
# Staging deployment commands
endif
// Dépendance des fichiers
Vous pouvez faire en sorte que les cibles dépendent des fichiers, de sorte qu’ils s’exécutent en cas de besoin:
requirements.txt: pyproject.toml
pip-compile pyproject.toml
.PHONY: sync-deps
sync-deps: requirements.txt ## Sync dependencies
pip-sync requirements.txt
🔗 Voici un exemple de Terminez Makefile pour une application Web Flask.
# Meilleures pratiques et conseils
Voici quelques meilleures pratiques à suivre lors de la rédaction de Makefiles:
- Ne compliquez pas votre makefile. Si une tâche devient complexe, envisagez de déplacer la logique vers un script séparé et de l’appeler à partir de Make.
- Choisissez des noms de commande qui indiquent clairement ce qu’ils font. Faire un test est meilleur que de faire t, et rendre le devantume est plus clair que de faire la configuration.
- Pour les commandes qui ne créent pas de fichiers, déclarez toujours les .phony. Cela empêche les problèmes si quelqu’un crée un fichier avec le même nom que votre commande.
- Organisez vos makefiles pour regrouper les fonctionnalités liées ensemble.
- Assurez-vous que toutes vos commandes fonctionnent à partir d’un nouveau clone de votre référentiel. Rien ne frustre les nouveaux contributeurs comme un processus de configuration brisé.
# Conclusion
Makefiles peut sembler être un outil à l’ancienne, mais ils sont efficaces pour les projets Python. Ils fournissent une interface cohérente pour les tâches courantes et aident les nouveaux contributeurs à se produir rapidement.
Créez un makefile de base avec les commandes d’installation, de test et d’aide. À mesure que votre projet se développe et que votre flux de travail devient plus complexe, vous pouvez ajouter plus de cibles et de dépendances au besoin.
N’oubliez pas que l’objectif n’est pas de créer le makefile le plus intelligent ou le plus complexe possible. C’est pour rendre vos tâches de développement quotidiennes plus faciles et plus fiables. Restez simple, gardez-le utile et laissez votre makefile devenir le centre de commande qui apporte l’ordre à votre chaos de projet Python.
Bala Priya C est développeur et écrivain technique d’Inde. Elle aime travailler à l’intersection des mathématiques, de la programmation, de la science des données et de la création de contenu. Ses domaines d’intérêt et d’expertise incluent DevOps, la science des données et le traitement du langage naturel. Elle aime lire, écrire, coder et café! Actuellement, elle travaille sur l’apprentissage et le partage de ses connaissances avec la communauté des développeurs en créant des tutoriels, des guides pratiques, des pièces d’opinion, etc. Bala crée également des aperçus de ressources engageants et des tutoriels de codage.