Imposer des standards de code dans une équipe multi-langage
La qualité du code dans une équipe n'est pas une question de préférence personnelle — c'est réduire les frictions en revue et prévenir des classes entières de bugs. Voici la configuration de linting et de formatting que nous utilisons sur TypeScript et Python dans un monorepo partagé, appliquée automatiquement en CI.
La qualité du code à grande échelle nécessite de l'automatisation. Ce guide couvre notre stratégie complète de linting et de formatage dans un monorepo polyglotte : ESLint avec le cache Turborepo, Prettier pour le formatage, les outils Python (Black, Flake8, Isort), et l'application en CI/CD.
Partie 1 : Linting Scalable avec Turborepo & ESLint
Configuration Partagée
Au lieu de copier-coller des fichiers .eslintrc.js, nous publions un package local @repo/eslint-config.
- packages/eslint-config/nest.js : Règles de base pour tous les microservices NestJS.
- apps/api/.eslintrc.js : Étend la configuration de base.
module.exports = {
extends: ["@repo/eslint-config/nest.js"]
};
Cache Intelligent
Turborepo connaît votre graphe de dépendances. Si vous ne changez que le service payment, turbo lint ne re-lintera que ce service, économisant des minutes sur chaque build.
{
"pipeline": {
"lint": {
"dependsOn": ["^lint"],
"outputs": []
}
}
}
Exécution Parallèle
Exécuter npm run lint lance toutes les tâches de lint en parallèle. Le cache garantit que les services inchangés obtiennent un résultat instantané.
> turbo run lint
api:lint: cache hit, replaying output...
payment:lint: cache hit, replaying output...
client:lint: cache miss, executing...
Partie 2 : Formatage Opinioné avec Prettier
La Source Unique de Vérité
Nos règles de formatage sont encodées dans .prettierrc, respectées par les IDEs, les hooks de commit et le CI :
{
"semi": true,
"singleQuote": true,
"trailingComma": "all",
"printWidth": 100
}
Intégration ESLint
L'utilisation de eslint-config-prettier est obligatoire pour désactiver les règles conflictuelles :
extends: [
'plugin:prettier/recommended',
]
Au-delà de JavaScript
Nous utilisons Prettier pour tout :
- JSON :
tsconfig.json,package.json - YAML :
docker-compose.yml, GitHub Actions - Markdown :
README.md, Documentation
Partie 3 : Qualité Stricte du Code Python
Black, Flake8, Isort
Trois outils non négociables pour Python :
- Black : « Le formateur de code intransigeant ». Aucun débat sur l'espacement.
- Flake8 : Détecte les erreurs logiques et les imports inutilisés.
- Isort : Trie vos imports alphabétiquement et par type.
Configuration Centralisée
[tool.black]
line-length = 88
target-version = ['py311']
[tool.isort]
profile = "black"
line_length = 88
Intégration Pre-Commit
Nous utilisons des hooks pre-commit pour corriger les problèmes avant même qu'ils n'atteignent le dépôt.
# .pre-commit-config.yaml
- repo: https://github.com/psf/black
rev: 23.3.0
hooks: [id: black]
Partie 4 : Automatisation des Vérifications de Qualité en CI/CD
Le Workflow de Qualité
Les hooks locaux peuvent être contournés. Le pipeline CI est l'arbitre final de la qualité. Nous l'exécutons sur chaque Pull Request.
Workflow GitHub Actions
name: Quality Check
on:
pull_request:
branches: [main]
jobs:
lint-node:
name: Lint Node.js (ESLint + Prettier)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 18
cache: 'npm'
- run: npm ci
- run: npx turbo run lint
lint-python:
name: Lint Python (Black + Flake8)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.11'
cache: 'pip'
- run: pip install black flake8
- run: black --check .
- run: flake8 .
Conseils Production
- Protection des branches : Configurez les paramètres GitHub pour exiger que les vérifications
Lint Node.jsetLint Pythonpassent avant le merge. Cela empêche les « fenêtres cassées » dans votre base de code. - Husky : Utilisez Husky pour exécuter les linters sur
pre-commiten local. Cela économise des minutes CI en détectant les erreurs avant le push. - Dépréciation des règles : Révisez vos règles ESLint tous les 6 mois. Si une règle est constamment ignorée ou désactivée, supprimez-la. Les règles doivent aider, pas gêner.
Écrit par

Tech Lead et Ingénieur Full Stack pilotant une équipe de 5 ingénieurs chez Fygurs (Paris, Remote) sur un SaaS cloud-native Azure. Diplômé de 1337 Coding School (42 Network / UM6P). Écrit sur l'architecture, l'infrastructure cloud et le leadership technique.