Automatisation des Tâches Django avec un Makefile

Ce guide vous explique comment automatiser la gestion de votre projet Django à l'aide d'un Makefile. Nous allons couvrir la création du projet, la gestion des environnements virtuels, et l'exécution des tâches courantes.

1. Introduction

Un Makefile est un outil puissant pour automatiser les tâches de développement dans un projet Django. Il vous permet d'exécuter des commandes courantes avec une simple commande make. Cet article explique comment configurer un Makefile pour un projet Django et comment l'utiliser sur macOS, Linux et Windows.

2. Structure du Projet

Avant de commencer, assurez-vous d'avoir une structure de répertoires claire pour votre projet. Suivez ces étapes pour créer votre répertoire de projet et le Makefile.

Créer le Répertoire du Projet

Ouvrez un terminal et exécutez les commandes suivantes pour créer un répertoire pour votre projet :

mkdir my_django_project
cd my_django_project

1. Configuration de Makefile pour Django sur macOS et Linux

Étape 1 : Créer le fichier Makefile

Dans le répertoire racine de votre projet Django, créez un fichier nommé Makefile (sans extension) :

touch Makefile

Étape 2 : Éditer le Makefile

Ouvrez le fichier Makefile avec votre éditeur de texte préféré et ajoutez le contenu suivant :

# Variables
PYTHON = python3
PIP = pip3
MANAGE = $(PYTHON) manage.py

# Commandes
.PHONY: install run migrate makemigrations shell test clean help venv create_project collectstatic check lint coverage freeze startapp dbbackup dbrestore

help:
	@echo "Usage:"
	@echo "  make [command]"
	@echo ""
	@echo "Commands:"
	@echo "  make venv          - Create a virtual environment"
	@echo "  make install       - Install dependencies"
	@echo "  make create_project - Create a new Django project"
	@echo "  make run           - Run the development server"
	@echo "  make migrate       - Apply database migrations"
	@echo "  make shell         - Start Django shell"
	@echo "  make createsuperuser - Create a superuser"
	@echo "  make test          - Run tests"
	@echo "  make makemigrations - Create new migrations"
	@echo "  make collectstatic - Collect static files"
	@echo "  make check         - Check for any problems"
	@echo "  make lint          - Run flake8 linter"
	@echo "  make coverage      - Run tests with coverage"
	@echo "  make clean         - Remove Python file artifacts"
	@echo "  make freeze        - Generate requirements.txt from installed packages"
	@echo "  make startapp      - Create a new Django app"
	@echo "  make dbbackup      - Backup the database"
	@echo "  make dbrestore     - Restore the database from a backup"

venv:
	$(PYTHON) -m venv venv
	. venv/bin/activate && $(PIP) install --upgrade pip

install: venv
	@if [ ! -f requirements.txt ]; then \
		echo "Error: requirements.txt not found."; \
		exit 1; \
	fi
	. venv/bin/activate && $(PIP) install -r requirements.txt

create_project: venv
	@read -p "Enter project name: " project_name; \
	. venv/bin/activate && $(PYTHON) -m django startproject $$project_name .; \
	echo "django" > requirements.txt; \
	$(PIP) freeze > requirements.txt

run:
	. venv/bin/activate && $(PYTHON) manage.py runserver

migrate:
	. venv/bin/activate && $(PYTHON) manage.py migrate

shell:
	. venv/bin/activate && $(PYTHON) manage.py shell

createsuperuser:
	. venv/bin/activate && $(PYTHON) manage.py createsuperuser

test:
	. venv/bin/activate && $(PYTHON) manage.py test

makemigrations:
	. venv/bin/activate && $(PYTHON) manage.py makemigrations

collectstatic:
	. venv/bin/activate && $(PYTHON) manage.py collectstatic --noinput

check:
	. venv/bin/activate && $(PYTHON) manage.py check

lint:
	. venv/bin/activate && flake8 .

coverage:
	. venv/bin/activate && coverage run --source='.' manage.py test
	. venv/bin/activate && coverage report

clean:
	find . -type f -name "*.pyc" -delete
	find . -type d -name "__pycache__" -exec rm -rf {} +

freeze:
	. venv/bin/activate && $(PIP) freeze > requirements.txt

startapp:
	@read -p "Enter app name: " app_name; \
	. venv/bin/activate && $(PYTHON) manage.py startapp $$app_name

dbbackup:
	. venv/bin/activate && $(PYTHON) manage.py dbbackup

dbrestore:
	. venv/bin/activate && $(PYTHON) manage.py dbrestore --input $(file)

Étape 3 : Utiliser le Makefile

Utilisez les commandes suivantes pour exécuter diverses tâches avec le Makefile :

  • Pour créer un environnement virtuel :

    make venv
  • Pour installer les dépendances :

    make install
  • Pour créer un nouveau projet Django :

    make create_project
  • Pour lancer le serveur de développement :

    make run
  • Pour appliquer les migrations :

    make migrate
  • Pour ouvrir un shell Django :

    make shell
  • Pour créer un superutilisateur :

    make createsuperuser
  • Pour lancer les tests :

    make test
  • Pour créer de nouvelles migrations :

    make makemigrations
  • Pour collecter les fichiers statiques :

    make collectstatic
  • Pour vérifier les problèmes :

    make check
  • Pour exécuter le linter :

    make lint
  • Pour exécuter les tests avec couverture :

    make coverage
  • Pour nettoyer les fichiers .pyc et pycache :

    make clean
  • Pour générer requirements.txt depuis les paquets installés :

    make freeze
  • Pour créer une nouvelle application Django :

    make startapp
  • Pour sauvegarder la base de données :

    make dbbackup
  • Pour restaurer la base de données à partir d'une sauvegarde :

    make dbrestore

2. Configuration de Makefile pour Django sur Windows

Options pour Utiliser Makefile sur Windows

  1. Utiliser Windows Subsystem for Linux (WSL) :

    • C'est la méthode recommandée pour une compatibilité maximale.
    • Installez WSL depuis le Microsoft Store ou via PowerShell.
    • Installez une distribution Linux (comme Ubuntu).
    • Utilisez le terminal WSL comme vous le feriez sur un système Unix.
  2. Utiliser Git Bash :

    • Si vous avez Git for Windows installé :
      • Ouvrez Git Bash.
      • Naviguez vers votre projet Django.
      • Utilisez les commandes make normalement.
  3. Installer GNU Make pour Windows :

    • Téléchargez Make pour Windows depuis GnuWin32.
    • Installez-le et ajoutez-le à votre PATH.
    • Utilisez make depuis le Command Prompt ou PowerShell.
  4. Utiliser un fichier batch (.bat) à la place :

    • Si vous préférez une solution 100% Windows, vous pouvez créer un fichier make.bat :
@echo off
IF "%1"=="venv" (
    python -m venv venv
    venv\Scripts\activate && pip install --upgrade pip
)
IF "%1"=="install" (
    IF NOT EXIST requirements.txt (
        echo Error: requirements.txt not found.
        exit /b 1
    )
    venv\Scripts\activate && pip install -r requirements.txt
)
IF "%1"=="create_project" (
    set /p project_name="Enter project name: "
    venv\Scripts\activate && python -m django startproject %project_name% .
    echo django > requirements.txt
    venv\Scripts\pip freeze > requirements.txt
)
IF "%1"=="run" (
    venv\Scripts\python manage.py runserver
)
IF "%1"=="migrate" (
    venv\Scripts\python manage.py migrate
)
IF "%1"=="shell" (
    venv\Scripts\python manage.py shell
)
IF "%1"=="createsuperuser" (
    venv\Scripts\python manage.py createsuperuser
)
IF "%1"=="test" (
    venv\Scripts\python manage.py test
)
IF "%1"=="makemigrations" (
    venv\Scripts\python manage.py makemigrations
)
IF "%1"=="collectstatic" (
    venv\

Scripts\python manage.py collectstatic --noinput
)
IF "%1"=="check" (
    venv\Scripts\python manage.py check
)
IF "%1"=="lint" (
    venv\Scripts\flake8 .
)
IF "%1"=="coverage" (
    venv\Scripts\coverage run --source=. manage.py test
    venv\Scripts\coverage report
)
IF "%1"=="clean" (
    del /Q *.pyc
    rmdir /S /Q __pycache__
)
IF "%1"=="freeze" (
    venv\Scripts\pip freeze > requirements.txt
)
IF "%1"=="startapp" (
    set /p app_name="Enter app name: "
    venv\Scripts\python manage.py startapp %app_name%
)
IF "%1"=="dbbackup" (
    venv\Scripts\python manage.py dbbackup
)
IF "%1"=="dbrestore" (
    venv\Scripts\python manage.py dbrestore --input %2
)

Utilisation de make.bat

  1. Pour créer un environnement virtuel :

    make.bat venv
  2. Pour installer les dépendances :

    make.bat install
  3. Pour créer un nouveau projet Django :

    make.bat create_project
  4. Pour lancer le serveur de développement :

    make.bat run
  5. Pour appliquer les migrations :

    make.bat migrate
  6. Pour ouvrir un shell Django :

    make.bat shell
  7. Pour créer un superutilisateur :

    make.bat createsuperuser
  8. Pour lancer les tests :

    make.bat test
  9. Pour créer de nouvelles migrations :

    make.bat makemigrations
  10. Pour collecter les fichiers statiques :

    make.bat collectstatic
  11. Pour vérifier les problèmes :

    make.bat check
  12. Pour exécuter le linter :

    make.bat lint
  13. Pour exécuter les tests avec couverture :

    make.bat coverage
  14. Pour nettoyer les fichiers .pyc et pycache :

    make.bat clean
  15. Pour générer requirements.txt depuis les paquets installés :

    make.bat freeze
  16. Pour créer une nouvelle application Django :

    make.bat startapp
  17. Pour sauvegarder la base de données :

    make.bat dbbackup
  18. Pour restaurer la base de données à partir d'une sauvegarde :

    make.bat dbrestore backup_file

3. Configuration de Makefile pour Django sur macOS, Linux et Windows

Dans le répertoire my_django_project, créez un fichier nommé Makefile avec le contenu suivant :

# Makefile pour gérer un projet Django

.PHONY: help venv install create_project run migrate shell createsuperuser test makemigrations collectstatic check lint coverage clean freeze startapp dbbackup dbrestore

# Détection automatique de l'OS
ifeq ($(OS),Windows_NT)
    PYTHON := python
    VENV := venv
    VENV_ACTIVATE := $(VENV)\Scripts\activate
    MANAGE := $(VENV)\Scripts\python manage.py
    PIP := $(VENV)\Scripts\pip
    FIND := where
    RM := del /Q
    RMDIR := rmdir /S /Q
    PIP_FREEZE := $(VENV)\Scripts\pip freeze > requirements.txt
    DB_BACKUP := $(MANAGE) dbbackup
    DB_RESTORE := $(MANAGE) dbrestore --input
else
    PYTHON := python3
    VENV := venv
    VENV_ACTIVATE := . $(VENV)/bin/activate
    MANAGE := $(VENV_ACTIVATE) && $(PYTHON) manage.py
    PIP := $(VENV)/bin/pip
    FIND := find
    RM := rm -f
    RMDIR := rm -rf
    PIP_FREEZE := $(VENV_ACTIVATE) && pip freeze > requirements.txt
    DB_BACKUP := $(MANAGE) dbbackup
    DB_RESTORE := $(MANAGE) dbrestore --input
endif

help:
    @echo "Usage:"
    @echo "  make [command]"
    @echo ""
    @echo "Commands:"
    @echo "  venv             Create a virtual environment"
    @echo "  install          Install dependencies"
    @echo "  create_project   Create a new Django project"
    @echo "  run              Run the development server"
    @echo "  migrate          Apply database migrations"
    @echo "  shell            Start Django shell"
    @echo "  createsuperuser  Create a superuser"
    @echo "  test             Run tests"
    @echo "  makemigrations   Create new migrations"
    @echo "  collectstatic    Collect static files"
    @echo "  check            Check for any problems"
    @echo "  lint             Run flake8 linter"
    @echo "  coverage         Run tests with coverage"
    @echo "  clean            Remove Python file artifacts"
    @echo "  freeze           Generate requirements.txt from installed packages"
    @echo "  startapp         Create a new Django app"
    @echo "  dbbackup         Backup the database"
    @echo "  dbrestore        Restore the database from a backup"

venv:
    $(PYTHON) -m venv $(VENV)
    $(VENV_ACTIVATE) && $(PIP) install --upgrade pip

install: venv
    @if [ ! -f requirements.txt ]; then \
        echo "Error: requirements.txt not found."; \
        exit 1; \
    fi
    $(VENV_ACTIVATE) && $(PIP) install -r requirements.txt

create_project: venv
    @read -p "Enter project name: " project_name; \
    $(VENV_ACTIVATE) && $(PYTHON) -m django startproject $$project_name .; \
    echo "django" > requirements.txt; \
    $(PIP_FREEZE)

run:
    $(MANAGE) runserver

migrate:
    $(MANAGE) migrate

shell:
    $(MANAGE) shell

createsuperuser:
    $(MANAGE) createsuperuser

test:
    $(MANAGE) test

makemigrations:
    $(MANAGE) makemigrations

collectstatic:
    $(MANAGE) collectstatic --noinput

check:
    $(MANAGE) check

lint:
    $(VENV_ACTIVATE) && flake8 .

coverage:
    $(VENV_ACTIVATE) && coverage run --source='.' manage.py test
    $(VENV_ACTIVATE) && coverage report

clean:
    $(FIND) . -type f -name "*.pyc" -exec $(RM) {} +
    $(FIND) . -type d -name "__pycache__" -exec $(RMDIR) {} +

freeze:
    $(PIP_FREEZE)

startapp:
    @read -p "Enter app name: " app_name; \
    $(VENV_ACTIVATE) && $(MANAGE) startapp $$app_name

dbbackup:
    $(DB_BACKUP)

dbrestore:
    $(DB_RESTORE) $(file)

3. Utilisation du Makefile

Voici comment utiliser le Makefile pour gérer votre projet Django :

Créer l'Environnement Virtuel et Installer les Dépendances

Pour créer un environnement virtuel et installer les dépendances, exécutez :

make install

Cela vérifiera si requirements.txt existe, sinon, il affichera une erreur.

Créer un Nouveau Projet Django

Pour créer un nouveau projet Django, utilisez :

make create_project

Le nom du projet vous sera demandé.

Exécuter le Serveur de Développement

Pour démarrer le serveur de développement, utilisez :

make run

Autres Commandes Utiles

Voici quelques autres commandes que vous pouvez utiliser avec le Makefile :

  • Migrations : make migrate
  • Shell Django : make shell
  • Création d'App : make startapp
  • Sauvegarde de Base de Données : make dbbackup

Conclusion

Ce Makefile vous permet de gérer facilement les tâches courantes liées à votre projet Django. Il simplifie la création du projet, la gestion des dépendances, et l'exécution des tâches, tout en offrant une automatisation précieuse pour les développeurs Django.