Accueil / Blog / Métier / 2016 / Gérer ses dépendances Drupal 7 avec Composer

Gérer ses dépendances Drupal 7 avec Composer

Par Sébastien Corbin publié 08/12/2016
Drupal.org distribue maintenant les modules et thèmes dans son propre dépôt Packagist, voyons comment en tirer partie avec Composer.
Gérer ses dépendances Drupal 7 avec Composer

Composer avec Drupal

Dans un souci de se réunifier avec la communauté PHP, l'équipe de l'infrastructure de Drupal.org a mis en place un dépôt Packagist. Cette initiative, lancée d'abord par webflo sur https://packagist.drupal-composer.org/ puis reprise par l'équipe de l'association sur packages.drupal.org, permet de gérer Drupal et ses dépendances via Composer.

L'utilité de Composer et de récupérer et placer automatiquement des modules dans les bons dossiers ainsi que de créer un autoloader qui gère automatiquement les namespaces PHP.

Installation de composer

L'installation de composer sous un système Unix est simple :

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"php -r "if (hash_file('SHA384', 'composer-setup.php') === 'e115a8dc7871f15d853148a7fbac7da27d6c0030b848d9b3dc09e2a0388afed865e6a3d6b3c0fad45c48e2b5fc1196ae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"php composer-setup.phpphp -r "unlink('composer-setup.php');"mv composer.phar /usr/local/bin/composer

Sous Windows, c'est encore plus simple, un installer est à disposition.

Le fonctionnement de Composer

Le fonctionnement de Composer (en mode utilisateur) est assez simple, il requiert de connaître un peu sa terminologie :

  • composer.json: définit les metadonnées du projet et de ses dépendances.
  • composer.lock: fichier de métadonnées qui contient les informations calculées à propos des dépendances et de leur état (versions, urls, etc.).
  • composer install: télécharge et installe les dépendances, construit l'autoloader de classes PHP. Si un fichier .lock est présent, il installera les dépendances en fonction de celui-ci, sinon il calculera et résoudra les informations sur les versions et les urls pour les dépendances.
  • composer update: met à jour les dependances et reconstruit le fichier .lock.
  • composer require: ajoute une nouvelle dépendance, mettant à jour les fichiers .json et .lock.
  • composer remove: retire une dépendance, mettant à jour les fichiers .json et .lock.

Toutes les commandes de Composer doivent être executées dans le même repertoire que votre fichier composer.json.

Exemple de fichier composer.json pour Drupal 7

{
  "name" : "Example site",
  "description" : "Drupal Site",
  "license" : "Proprietary",
  "repositories": [
    {
      "type": "composer",
      "url": "https://packages.drupal.org/7"
    }
  ],
  "minimum-stability" : "dev",
  "prefer-stable" : true,
  "require" : {
    "composer/installers" : "^1.0.20",
    "cweagans/composer-patches" : "~1.0",
    "drush/drush": "7.*",
    "drupal/drupal": "7.*",
    "slowprog/composer-copy-file": "^0.1.2",
    "symfony/dependency-injection" : "~3.0",
    "symfony/templating" : "~3.0",
    "symfony/twig-bridge" : "~3.0",
    "symfony/twig-bundle" : "~3.0",
    "tfd7/tfd7": "dev-master",
    "twig/extensions": "~1.3",
    "twig/twig": "~1.20|~2.0",
    "makinacorpus/drupal-sf-dic": "^3.1"
  },
  "config" : {
    "vendor-dir" : "lib/vendor"
  },
  "extra" : {
    "installer-paths": {
      "www" : [ "type:drupal-core" ],
      "www/sites/all/modules/composer/{$name}" : [ "type:drupal-module" ],
      "www/sites/all/libraries/composer/{$name}" : [ "type:drupal-library" ],
      "www/sites/all/themes/composer/{$name}" : [ "type:drupal-theme" ]
    },
    "copy-file": {
      "www/sites/all/modules/composer/drupal-sf-dic/Resources/engine": "www/sites/all/themes/engines/twig"
    }
  },
  "scripts": {
      "append_settings": "grep -Fq \"require_once DRUPAL_ROOT . '/../lib/vendor/autoload.php';\" www/sites/default/default.settings.php || echo \"\nrequire_once DRUPAL_ROOT . '/../lib/vendor/autoload.php';\n\n\\$GLOBALS['conf']['kernel.cache_dir'] = DRUPAL_ROOT . '/../cache/';\n\\$GLOBALS['conf']['kernel.logs_dir'] = DRUPAL_ROOT . '/../logs/';\n\" >> www/sites/default/default.settings.php",
    "post-install-cmd": [
      "SlowProg\\CopyFile\\ScriptHandler::copy",
      "@append_settings"
    ],
    "post-update-cmd": [
      "SlowProg\\CopyFile\\ScriptHandler::copy",
      "@append_settings"
    ]
  },
  "autoload": {
    "psr-4": {
      "Example\\MyLibrary\\" : "www/sites/all/modules/custom/my_library/src"
    }
  }
}

Une fois la commande composer install lancée, vous pouvez installer votre site normalement. Vous pouvez dès à présent utiliser des composants PHP dans vos modules.

Cette configuration inclut également un module magique, sf_dic, qui permet d'utiliser Symfony dans Drupal, et notamment :

Déclarer des services et utiliser le DIC de Symfony Créer des formulaires Drupal 7 à la mode Drupal 8
ABONNEZ-VOUS À LA NEWSLETTER !
Voir aussi
Développer avec Twig dans Drupal 7 Développer avec Twig dans Drupal 7 25/06/2015

Utiliser Twig dans Drupal 7, c'est possible ! Découvrez comment prendre de l'avance sur Drupal 8, ...

Comment mettre en place un site Drupal "Headless" ? Comment mettre en place un site Drupal "Headless" ? 14/06/2017

Les différents modules et techniques pour mettre en place une couche de services web sur une base ...

Migrer de SPIP à Drupal Migrer de SPIP à Drupal 29/05/2017

Comment imiter le comportement de SPIP et découvrir Drupal pour les amateurs de ce CMS.

Bien débuter avec les transactions SQL Bien débuter avec les transactions SQL 09/12/2015

BEGIN et COMMIT vous connaissez, mais ACID ou LOCK ça vous dit quelque chose ?

La roadmap Drupal 8 La roadmap Drupal 8 05/04/2017

Que va-t-il se passer dans le cœur du CMS Drupal dans les prochains mois ?