Créer ses propres commandes pour Drush

Créer ses propres commandes pour Drush

07 Sep 2010 |  Drupal

Depuis que j’utilise Drush je n’arrive plus à m’en passer, j’avoue qu’au départ je n’en voyais pas trop l’intérêt mais aujourd’hui je ne ferais plus sans. L’administration de son Drupal en quelques lignes de commande c’est un régal. A tel point que j’oublie souvent d’activer les sous modules de certains modules et que je ne comprends pas pourquoi ça ne fonctionne pas comme prévu.

Si vous êtes donc comme moi utilisateur de Drush, il vous arrivera un jour où vous vous apercevrez que vous effectuez des actions qui pourraient être simplifiées ou automatisées, et qu’en fait, tout ça pourrait se résumer à l’exécution d’une seule commande. Simplifiez-vous la vie et créez vos commandes Drush!

Dans ce post nous allons donc voir comment créer une commande Drush. A l’origine de cet article je comptais vous montrer une commande créée par mes soins mais au final je préfère détailler le fichier exemple de Drush qui sera bien plus parlant.

Sachez donc que dans votre répertoire Drush, il existe un dossier nommé “examples” et qu’il contient de la documentation afin de créer des alias de sites ou dans notre cas ses propres commandes Drush. Nous verrons donc au cours de cet article, les exemples du fichier sandwich.drush.inc

Déclaration de notre nouvelle commande

La première chose à faire consiste à créer notre fichier de commande que l’on nommera noms_de_commande.drush.inc. Vous avez le choix de le placer à plusieurs endroits, pour ma part je l’ajoute dans mes modules lorsqu’il concerne un module en particulier ou dans un dossier .drush à la racine de mon répertoire home quand les commandes peuvent être utilisées pour plusieurs projets.

La déclaration de notre première commande se fait grâce au hook_drush_command().

/**
 * Implementation of hook_drush_command().
 */
function sandwich_drush_command() {
  $items = array();

  $items['make-me-a-sandwich'] = array(
    'description' => "Makes a delicious sandwich.",
    'arguments' => array(
      'filling' => 'The type of the sandwich (turkey, cheese, etc.)',
    ),
    'options' => array(
      'spreads' => 'Comma delimited list of spreads (e.g. mayonnaise, mustard)',
    ),
    'examples' => array(
      'drush make-me-a-sandwich turkey --spreads=ketchup,mustard',
    ),
    'aliases' => array('mmas'),
    'bootstrap' => DRUSH_BOOTSTRAP_DRUSH, // No bootstrap at all.
  );

  return $items;
}

Vous pouvez remarquer que cette déclaration est semblable à la déclaration d’une nouvelle entrée de menu puisqu’on retrouve le nom de la commande, la description ou encore les arguments à passer. La commande Drush ci-dessus s’appelle “make-me-a-sandwich”, c’est donc ce texte que vous aurez à taper dans votre éditeur de ligne de commande pour exécuter votre action.

Un peu d’aide pour l’utilisation de notre commande

Ecrire de la doc… Oui on sait tous que ce n’est pas le point fort des développeurs :) or on est bien d’accord pour dire que ca devient utile quand on réutilise du code 6 mois plus tard ou lorsque quelqu’un d’autre est amené à s’en servir.

Ainsi pour faciliter l’utilisation de vos commandes je vous conseille donc d’implémenter le hook_drush_help().

/**
 * Implementation of hook_drush_help().
 */
function sandwich_drush_help($section) {
  switch ($section) {
    case 'drush:make-me-a-sandwich':
      return dt("This command will make you a delicious sandwich, just how you like it.");
  }
}

Toujours pour notre commande de fabrication de sandwich, l’utilisateur obtiendra de l’aide en tapant “drush help make-me-a-sandwich” ou “drush make-me-a-sandwich –help”. L’aide retournera alors l’exemple de commande que vous avez renseigné lors de la déclaration ainsi que les informations sur les arguments ou options de votre commande s’il en existe.

Création de notre Commande Drush

Nous y voila, maintenant que nous avons déclaré notre commande, que nous l’avons documenté il ne nous reste plus qu’à la créer.

La convention de nommage veut que toutes commandes soit préfixées par “drush”, puis le nom de votre fichier “commandfile” pour enfin se terminer par le nom de votre fonction. Celui-ci doit être identique à ce que vous avez déclaré dans la variable $items tout en ayant pris le soin de remplaçer les tirets par des underscores.

Dans notre cas cela nous donne une fonction au nom de :

function drush_sandwich_make_me_a_sandwich() {}

Néanmoins, si pour une raison quelconque vous désirez nommer votre fonction autrement vous devrez alors renseigner la fonction de callback lors de la déclaration de votre commande

'callback' => "Drush_example_foo_execute"

Notre commande est maintenant prête à être utilisée, il ne vous reste plus qu’à faire votre cuisine.

Vous l’aurez compris l’ajout de commande Drush est vraiment très simple, je vous conseille de vous baser sur l’exemple fournit avec Drush, celui-ci est bien fait et bien documenté. Ajouter ses propres commandes, c’est un bon moyen pour gagner du temps sur les tâches quotidiennes ou redondantes, surtout lorsqu’elles sont exécutées par votre cron, on peut alors obtenir un joli système automatisé.

Julien Dubreuil

Vous avez une idée, un projet web à réaliser ?

Ensemble, mettons en oeuvre sa réussite. Je vous accompagne dans vos projets, depuis l'élaboration du cahier des charges jusqu'à la mise en production. Pour plus d'information n'hésitez pas à me contacter.

Contactez-moi