← Retour à la liste
★★★★½ 4.8 / 5
Catégorie 04SKILLS

Drupal Config

Config Management complet — drush deploy, config_split, hook_deploy_N, Recipes D11

Installation
Via npx (recommandé)npx skill add ThomasRoger76/drupal-config
Via gitgit clone https://github.com/ThomasRoger76/drupal-config.git ~/.claude/skills/drupal-config
Vérifier dans Claude Code/skills
VersionD8-D11 (hook_deploy_N D9.3+, Recipes D11)
PrixGratuit
Plateformes
Drupal 8Drupal 9Drupal 10Drupal 11
Commandes9
Exemples3
SKL
À propos

Skill de connaissance pure qui transforme Claude en expert Config Management Drupal 8-11+ — élimine les pièges de déploiement les plus coûteux dès la première utilisation. Contenu injecté : les 3 règles d'or (Git = source de vérité, config:status avant cim, UUID synchronisé), le workflow export→git→déploiement, la résolution des conflits UUID, les overrides par environnement ($config[], config_split, config_ignore, config_readonly), la distinction critique hook_deploy_N (s'exécute APRÈS drush cim) vs hook_update_N (s'exécute AVANT — cause 60% des déploiements cassés), la config optionnelle (config/optional/ vs config/install/), les Drupal Recipes D11 (createIfNotExists, grantPermissions), la traduction de config et les architectures multisite. Pas d'agents — skill de connaissance pure. Gain principal : zéro erreur hook_deploy_N vs hook_update_N (responsable de la majorité des régressions en production), config_split 3 environnements correct du premier essai.

Fonctionnalités clés
Les 3 règles d'or — zéro perte de configurationGit = source de vérité, drush config:status obligatoire avant cim, UUID synchronisé si réinstallation. Ces 3 règles évitent 90% des pertes de config en équipe.
hook_deploy_N — données après config, toujoursGénère hook_deploy_N (D9.3+) qui s'exécute APRÈS drush cim — les nouveaux champs sont en DB. hook_update_N s'exécute AVANT, piège classique qui casse les déploiements.
config_split — modules différents par environnementdevel/kint uniquement en local, shield en staging, config_readonly en production. Configuration via settings.php selon l'env, zéro code conditionnel dans le codebase.
Config Entities vs Simple ConfigDistingue les Config Entities (node.type.*, user.role.*) chargées via EntityTypeManager des Simple Configs (system.site) lues via Config API. Cascades de suppression comprises.
Drupal Recipes D11 — starter kits réutilisablesGénère des recipe.yml avec createIfNotExists, grantPermissions, config import et module install. Remplace les profils d'installation lourds pour distribuer des sets de config.
Config Translation + multisiteconfig_translation + locale pour traduire Views, menus, blocs. Sites.php + config_split par site pour les architectures multisite. drush --uri= pour cibler un site précis.
Commandes
CommandeDescription
drush cex --yesExporter la configuration active vers les fichiers YAML du répertoire sync
drush cim --yesImporter les fichiers YAML en base de données (après git pull)
drush config:statusVoir les différences avant import (only in active / only in sync / different)
drush config:diff nom.de.la.configAfficher le diff YAML détaillé d'une config spécifique
drush deployPipeline déploiement dans l'ordre correct : drush updb + drush cim + drush cr
drush config:get system.site uuidLire l'UUID du site (synchroniser entre envs si réinstallation de zéro)
drush php:eval "\Drupal::service('config.installer')->installOptionalConfig();"Forcer l'import des configs optional/ après installation d'un module
drush recipe web/recipes/mon_recipeAppliquer une Drupal Recipe D11 sur un site existant
drush config:delete nom.de.la.configSupprimer une config orpheline (vérifier les dépendances avant)
Exemples
hook_deploy_N — migrer des données après ajout d'un champCODE
<?php
// mon_module.deploy.php
// S'exécute APRÈS drush cim — field_reading_time est déjà en DB

function mon_module_deploy_10001(array &$sandbox): string {
  if (!isset($sandbox['total'])) {
    $nids = \Drupal::entityQuery('node')
      ->condition('type', 'article')
      ->condition('status', 1)
      ->accessCheck(FALSE)
      ->execute();
    $sandbox['nids']  = array_values($nids);
    $sandbox['total'] = count($nids);
    $sandbox['done']  = 0;
  }
  $batch = array_splice($sandbox['nids'], 0, 50);
  foreach (\Drupal::entityTypeManager()->getStorage('node')->loadMultiple($batch) as $node) {
    $words   = str_word_count(strip_tags($node->body->value ?? ''));
    $minutes = (int) ceil($words / 200);
    $node->set('field_reading_time', $minutes)->save();
    $sandbox['done']++;
  }
  $sandbox['#finished'] = $sandbox['total'] ? $sandbox['done'] / $sandbox['total'] : 1;
  return "Traité {$sandbox['done']}/{$sandbox['total']} articles.";
}
config_split — 3 environnements local/staging/productionCODE
# Structure
config/
  sync/          # Config commune à tous les envs
  split/
    local/       # devel, kint, webprofiler (jamais en prod)
    staging/     # shield (protège l'env de démo)
    production/  # config_readonly (bloque les modifs UI)

# settings.local.php
$config['config_split.config_split.local']['status'] = TRUE;

# settings.php (prod — détection par env var)
if (getenv('APP_ENV') === 'production') {
  $config['config_split.config_split.production']['status'] = TRUE;
  $config['system.logging']['error_level'] = 'hide';
  $config['smtp.settings']['smtp_password'] = getenv('SMTP_PASSWORD');
}
Drupal Recipe D11 — starter kit workflow éditorialCODE
# web/recipes/editorial_workflow/recipe.yml
name: Editorial Workflow
description: Workflow draft→review→published avec rôles editor et reviewer
install:
  - content_moderation
  - workflows
config:
  import:
    - workflows.workflow.editorial
  actions:
    user.role.editor:
      createIfNotExists:
        label: Editor
      grantPermissions:
        - create article content
        - edit own article content
        - use editorial transition create_new_draft
    user.role.reviewer:
      createIfNotExists:
        label: Reviewer
      grantPermissions:
        - use editorial transition publish

# Appliquer : drush recipe web/recipes/editorial_workflow
Points forts & faibles
Points forts
+Génère le hook_deploy_N correct systématiquement — fini les erreurs avant/après cim
+config_split avec exemples pratiques par environnement
+Drupal Recipes D11 intégrées — plus rapide que les profils custom
+Résolution UUID expliquée pas à pas
Points faibles
config_split v2 vs v3 — API légèrement différente selon la version installée
Drupal Recipes encore en évolution (syntaxe peut changer entre versions D11)
Verdict

Skill incontournable pour toute équipe Drupal. Le hook_deploy_N expliqué avec exemple de batch, et la configuration config_split par environnement évitent les erreurs les plus coûteuses en production.

Développeurs Drupal, DevOps, tech leads qui gèrent le déploiement multi-environnements