Drush, crear comandos personalizados. Drupal

Drush es una herramienta de línea de comandos para Drupal

Drush nos facilita realizar ciertas tareas habituales desde consola, tales como: backup de base de datos, descarga y activación de módulos y temas, limpiar caches, obtener y asignar valores a variables, ver el log en tiempo real, y muchos más comandos que están documentados en http://drushcommands.com/
 
Además de los comandos de drush y los extendidos de los módulos contrib de drupal, podemos definir nuestros propios comandos drush en nuestros módulos custom.

Cómo crear nuestros comandos drush

Lo primero que debemos crear es un fichero mymodule.drush.inc, dentro de nuestro módulo y en el que incluiremos las funciones.
 
Implementamos el hook drush_command en el que definimos nuestro comando, indicando el nombre, la descripción, alias (opcional), argumentos (opcional) y opciones (opcional).
 
/**
* Implements hook_drush_command().
*/
function mymodule_drush_command() {
$items = array();
$items['site-import'] = array(
   'description' => 'Import data from origin',
   'aliases' => array('simp'),
   'arguments' => array(
     'type' => 'Import type: blog, new or event',
    ),
  'options' => array(
    'elements' => 'The number of elements to import.',
  ),
);

return $items;
}
 
Argumentos
 
En las siguientes líneas se define que el comando drush soporta el argumento type, en nuestro caso utilizaremos para definir que tipo de contenido vamos a importar.
 
'arguments' => array(
     'type' => 'Import type: blog, new or event',
    ),
 
Opciones
 
En la siguientes líneas definimos la opción que acepta el comando drush, en nuestro caso la utilizaremos para indicar el número de elementos del tipo type que vamos a importar:
 
  'options' => array(
    'elements' => 'The number of elements to import.',
  ),
 
La función callback de nuestro comando (site_import)
 
function drush_site_import($type) {
  // drush_log (t('Importing data ') . date('Ymd His'));
 $elements = drush_get_option(‘elements', 1);
 if($elements > 0) {
    for($i=0; $i < elements; $i++) {
      mymodule_data_import($type);
    }
  }
  return;
}

function mymodule_data_import($type) {
  switch ($type) {
    case blog':
      // create content type node blog
    break;
    case new:
      // create content type node new
    break;
    case event:
      // create content type node event
    break;
}
Con el siguiente comando se ejecutará nuestro comando drush personalizado, importará 3 elementos de tipo blog:
 
drush site-import blog --elements=3
 
Al crear un comando drush tenemos que limpiar la caché de drush para que el comando esté disponible, para ello ejecutaremos: drush cc drush.
 
Algunas funciones para mostrar mensajes en pantalla y log:
drush_log: Esta función nos permite añadir un mensaje en el log.
drush_print: Pintar mensaje por defecto en pantalla, se puede indicar que la salida sea un fichero.
drush_print_r: Pinta un array o string.
Enlace a la documentación de la API de drush: http://api.drush.org/api/drush/
 
Documentación de drush: http://www.drush.org/
Bonus! Un módulo que crea un comando drush que nos automatiza la creación del esqueleto de un módulo drush: https://www.drupal.org/project/drushify
 
Dudas, mejoras, críticas son bien recibidas.
 
drush be-happy