Utilizando Drush

Charla sobre Drush en el Drupalcamp de Buenos Aires

http://drupal.org/project/drush
Drush fue creado originalmente por Arto para Drupal 4.7 (este código alfa aún se puede encontrar en la rama DRUPAL-4-7). En Mayo del 2007, fue parcialmente reescrito y rediseñado para Drupal 5 por frando. Desde el 2008, este módulo ha sido mantenido por Moshe Weitzman, Owen Barton y Adrian Rossouw.

Drush es al mismo tiempo una interface de programacion Unix y un shell de linea de comando para Drupal. Una verdadera navaja suiza diseñada para hacer más fácil la vida de aquellos que dedican gran parte de su horario laboral sentados frente a una linea de comandos.

Background

En la actualidad es muy común que un software dependa de otros para su funcionamiento. Estas dependencias se resuelven mediante el uso de los manejadores de paquetes. Para el caso de Debian, Ubuntu y derivativos, es familiar el comando apt-get. Para los usuarios de RedHat, Fedora y derivativos, sería el comando yum. Estos comandos permiten instalar aplicaciones, desinstalarlas, actualizarlas, todo esto desde la línea de comandos. Ellos se encargan de resolver todas las dependencias y mantener el sistema en un estado estable.

En Drupal tenemos a Drush, cuya función es muy similar a la de estos comandos recién mencionados.

Principales caracteristicas de drush

  • Trabajo con paquetes. El manejador de paquetes drush le permite descargar, habilitar, deshabilitar, desinstalar y actualizar módulos, temas, perfiles y traducciones desde la linea de comandos (con respecto a hacer el cafe ver mas adelante).
  • Actualizaciones. Drush le permite actualizar sus modulos con un solo comando: drush update
  • Tareas administrativas. Ejecutar el cron, limpiar la cache.
  • Interacción con la base de datos. Nos permite exportar/importar la base de datos. Tambien podemos ejecutar consultas, ver las credenciales (usuario/contraseña) de acceso a la base de datos.

ok, ok, lo voy a comprar, que tengo que hacer ...

Instalación

¿Que versión instalo?

Originalmente Drush era un módulo de Drupal y se instalaba como uno más.

Para la versión 2.0 se hizo una importante reescritura del código y entre los resultados de dicho esfuerzo tenemos que esta nueva versión es independiente de la versión de Drupal que estemos utilizando.

En la página del proyecto solo hay dos paquetes:

La versión oficial (official release):
http://ftp.drupal.org/files/projects/drush-All-Versions-2.0.tar.gz

La versión de desarrollo (development snapshot):
http://ftp.drupal.org/files/projects/drush-All-Versions-HEAD.tar.gz

No importa que versión de Drupal este utilizando, la versión de Drush va a ser la misma en cualquier caso (ya sea la estable o la de desarrollo).

Si tenia instalado una versión anterior de drush, deberá desinstalarla y su directorio. Lo mismo para cualquier otro módulo relacionado (drush_extras, drush_mm, etc).

Instalación

1. Descargar el archivo y descompactarlo en una carpeta fuera del raiz del sitio web (/path/to/drush).

(para este ejemplo: /path/to/drush = /var/www/drush).
Nota. es solo una decisión personal del autor guardar todo lo que sea web en la carpeta /var/www. Cada usuario puede establecer el lugar que mejor se ajuste a sus necesidades.

cd wget http://ftp.drupal.org/files/projects/drush-All-Versions-2.0.tar.gz cd /var/www sudo tar zxf ~/drush-All-Versions-2.0.tar.gz

Al descompactar este archivo se crea el directorio /var/www/drush con los archivos del modulo. Borrar el .tgz si no hace falta.

2. Otorgarle permisos de ejecución al comando drush
 

chmod u+x /path/to/drush/drush

3. Crear enlace simbolico
Opcional, pero recomendado. Puede ser de cualquiera de las dos formas siguientes:

a) crear un enlace a drush en un directorio que este en el $PATH:

ln -s /path/to/drush/drush /usr/bin/drush

b) crear un alias para el comando drush:

alias drush='/path/to/drush/drush'

Si utiliza bash. Esto puede ir al final del archivo ~/.bashrc

¿Donde instalar drush?

Fuera del directorio raiz del sitio web. Para este ejemplo se instalo en /var/www/drush.

Para mas información consultar:

allow drush files to be installed in standard locations - http://drupal.org/node/459678
Packaging Drush for Debian - http://drupal.org/node/461488

Existe un paquete .deb disponible que lo instala en /usr/share/drush  y crea de ahi un enlace simbólico en /usr/bin/drush. Disponible en:
http://debian.koumbit.net/debian/dists/unstable/main/binary-all/admin/

Tareas comunes

Trabajo con paquetes
El manejador de paquetes drush le permite descargar, habilitar, deshabilitar, desinstalar y actualizar módulos, temas, perfiles y traducciones desde la linea de comandos (con respecto a hacer el cafe ver mas adelante).

Actualizaciones
Drush le permite actualizar sus modulos con un solo comando: drush update

Tareas administrativas
Ejecutar el cron: drush cron
Limpiar la cache: drush cache clear

Interacción con la base de datos
Nos permite exportar/importar la base de datos: drush sql dump, drush sql load
Ejecutar consultas:
 

osvaldo@vostro:/var/www/drupal$ drush sql query "select count(*) from node;" count(*) 32

Comando básicos

Si drush se ejecuta solo aparece la ayuda de manera predeterminada con un listado de los comandos disponibles.
[ejecutar comando drush ]
 

osvaldo@vostro:~$ drush
Ejecuta un comando de drush. Ejecute 'drush help [comando]' para visualizar ayuda especifica a dicho comando.

Ejemplos:
 drush dl cck zen     Descargar el módulo CCK y el tema  Zen. 
 drush --uri=http://example.com status     Muestra el comando status para el sitio perteneciente a una instalación multisite example.com.
 drush help --pipe                         Genera la lista  de comandos delimitada por espacios. 

Opciones:
 -r , --root=   Directorio raiz de la instalación de Drupal que se va a utilizar (por defecto: directorio actual)
 -l  , --uri=     URI del sitio drupal que vamos a utilizar (necesaria solo en ambientes multisitios)
 -v, --verbose              Muestra información extra durante la  ejecución del comando.
 -d, --debug                Muestra aún mas información, incluyendo mensajes internos.
 -q, --quiet                Oculta toda salida (al ejecutar el comando en el shell).
 -y, --yes                  Asume "si' como respuesta a todas las preguntas.
 -s, --simulate             Simula las acciones a realizar pero no ejecuta ninguna realmente.
 -i, --include              Permite adicionar un listado de paths donde buscar comandos de drush.
 -c, --config               Permite especificar que fichero de configuración vamos a utilizar. 
                            Consultar el ejemplo example.drushrc.php                  
 -u, --user                 Permite especificar el usuario con el que vamos a iniciar sesión. Puede ser un número o un nombre.
 -b, --backend              Esconde la salida estandard y retorna solamente datos estructurados (solo se utiliza para uso interno).
 -p, --pipe                 Genera una representación compacta del comando para utilizarla en scripts.

Comandos:

help		  Imprime este mensaje de ayuda. Utilice --filter para especificar un comando en particular (e.g. --filter=pm)
cron	    Ejecuta todos los hooks de cron.
updatedb	Ejecuta el proceso update.php desde la linea de comando.
status	  Proporciona una vista general de la instalación actual de Drupal, si hubiera una 
        (útil para confirmar si el sitio sobre el que se esta ejecutando los comandos de drush es el que nos interesa).
script	Ejecuta script(s) php.
cache clear	    Borra todos los caches.
watchdog show	  Muestra los mensajes de trazas (watchdog) recientes. 
                Opcionalmente permite filtrar en base a un tipo determinado.
watchdog delete	Elimina todos los mensajes o solo aquellos de un tipo especifico.
sync	  Sincroniza el árbol de Drupal desde o hacia otro servidor utilizando ssh y rsync.
eval	  Evalua codigo php árbitrario después de iniciar (bootstrapping) Drupal.
enable	Habilita uno ó más módulos
disable	Deshabilita uno ó más módulos.
unistall	  Desinstala uno ó más módulos.
statusmodules	  Muestra el estado de los módulos  (habilitados o deshabilitados).
refresh	  Refresca la información sobre el status de actualización de los paquetes instalados.
updatecode	Actualiza el código del proyecto.
update	Actualiza el código del proyecto y aplica cualquier actualizacion requerida en la base de datos (update.php)
info		Muestra información sobre un proyecto.
dl		Descarga el core de Drupal y proyectos como CCK, Zen, etc.
test mail Ejecuta todos los tests y envia los resultados por email al team.
test clean	Elimina las tablas y archivos remanentes de anteriores ejecuciones de test.

sql conf	Imprime los detalles de la conexión a la base de datos
sql connect	Imprime el comando mysql para conectarse a la base de datos
sql dump	Exporta la base de datos de drupal como un archivo SQL utilizando mysqldump
sql query	Ejecuta una cosulta contra la base de datos del sitio
sql load	Copia la base de datos hacia la base de datos del sitio.
sql cli	Abre una interface de linea de comandos SQL utilizando las credenciales del sitio en Drupal.

Ejemplos:

instalando (descargando)
modulos

root@vostro:/var/www/drupal# drush dl fivestar
Project fivestar (6.x-1.15) downloaded to [success]
/var/www/drupal/sites/all/modules/.

temas

root@vostro:/var/www/drupal# drush dl nitobe
Project nitobe (6.x-3.4) downloaded to [success]
/var/www/drupal/sites/all/themes/.

traducciones

root@vostro:/var/www/drupal# drush dl it
Project it (6.x-1.4) downloaded to /var/www/drupal/. [success]
root@vostro:/var/www/drupal# ls -l modules/aggregator/translations/
total 44
-rw-r--r-- 1 root root 17835 2009-02-14 13:25 modules-aggregator.es.po
-rw-r--r-- 1 1080 1080 22473 2008-12-07 14:05 modules-aggregator.it.po

Las últimas versiones de drush detectan automáticamente cuando se trata de un módulo, un tema o una traducción y son capaces de instalarlos en los directorios correspondientes (de manera predeterminada en sites/all/modules o sites/all/themes, aunque esto es modificable definiendo --destination, para mas información, ejecute drush help dl)

mas comandos:
ver las versiones disponibles de un módulo

osvaldo@vostro:~$ drush -r /var/www/drupal-6.10/ info backup_migrate
Project Release Fecha
backup_migrate 6.x-2.x-dev 2009-Jun-04
backup_migrate 6.x-1.2 2009-Ene-18
backup_migrate 6.x-1.0 2008-Ago-13
backup_migrate 6.x-1.x-dev 2009-Feb-18

instalar una versión en particular

osvaldo@vostro:~$ drush -r /var/www/drupal-6.10/ dl backup_migrate-2.x-dev

Listado de módulos vinculados con drush:

http://drupal.org/taxonomy/term/4654

Estos módulos le adicionan funcionalidad al comando drush. De esta manera, utilizando el mismo comando drush, va a tener acceso a nuevo grupo de opciones.

Drush System Manager
http://drupal.org/project/drush_sm

El Drush System Manager le permite exportar a archivos tanto variables, como el código para la creación de los cck y las views existentes en Drupal. De esta manera, puede adicionar estos archivos a un sistema de control de versiones, como subversion, y mantener un control sobre los cambios que se van haciendo en el sistema a los mismos por el resto del equipo.

opciones que ofrece este módulo:

sm list cck : list from cck with arguments:
sm export cck : export from cck with arguments: stdout or directory
sm list variables : list from variables with arguments: variable name(s) or part of a variable name
sm export variables : export from variables with arguments: stdout or directory followed by variable name(s) or part of a variable name
sm report variables : report from variables with arguments: variable name(s) or part of a variable name
sm import variables : import from variables with arguments: stdout or directory
sm list views : list from views with arguments:
sm export views : export from views with arguments: stdout or directory followed by view name(s)

Dos cosas a mencionar respecto a este módulo. La primera es que todavía se encuentra en desarrollo. Funcionalidades como la de importar los cck o las views aún es posible que tenga errores. La otra es que, a diferencia del Drush, este módulo se va a instalra como un módulo del sitio en Drupal en el cual se vaya a utilizar. A diferencia del Drush que es independiente de la instalación del Drupal, este módulo si funciona directamente con la información del sitio y por lo tanto, si depende del sitio (las views no son iguales en un D5 que en un D6).

instalacion
Puede descargar de la página del proyecto, en este caso sería este archivo:
http://ftp.drupal.org/files/projects/drush_sm-6.x-2.x-dev.tar.gz

O mejor, hágalo a la manera drush ;)

root@vostro:/var/www/drupal/sites# drush dl drush_sm
Project drush_sm (6.x-2.x-dev) downloaded to [success]
/var/www/drupal/sites/all/modules/.
root@vostro:/var/www/drupal/sites# drush enable drush_sm
The following modules will be enabled: drush_sm
Do you really want to continue? (y/n): y
Drush System Manager was enabled successfully. [ok]
root@vostro:/var/www/drupal/sites#

Si ejecutamos ahora el comando drush veremos al final los nuevos comandos disponibles:

root@vostro:/var/www/drupal/sites# drush
Execute a drush command. Run `drush help [command]` to view command-specific
help.
....
 generate users        Creates users.                                         
 generate taxonomy     Creates taxonomy.                                      
 generate content      Creates content.                                       
 sm list cck           list from cck with arguments:                          
 sm export cck         export from cck with arguments: stdout or directory    
 sm list variables     list from variables with arguments: variable name(s) or
                       part of a variable name                                
 sm export variables   export from variables with arguments: stdout or        
                       directory followed by variable name(s) or part of a    
                       variable name                                          
 sm report variables   report from variables with arguments: variable name(s) 
                       or part of a variable name                             
 sm import variables   import from variables with arguments: stdout or        
                       directory                                              
 sm list views         list from views with arguments:                        
 sm export views       export from views with arguments: stdout or directory  
                       followed by view name(s)           

DRUSH FAQ
¿Se puede utilizar drush sobre Windows?
En principio si. En la práctica, ninguno de los desarrolladores de este módulo utiliza Windows en su trabajo diario por lo que aunque "teóricamente" php es compatible sobre Windows y otros sistemas operativos, siempre existe la posibilidad de algo no funcione como debe. Sin embargo, se aceptan gustosamente parches para solucionar cualquier problema que surja :)
http://civicactions.com/blog/2009/jun/10/drush_20_released_screencast_1_...