>

Drush para Drupal, el viejo Make y el moderno Composer

davidjguru     Colaboraciones    04/11/2016

Un compañero de viaje fundamental para la vida del Drupalero: Drush. Su fiel hijo (Make) y un nuevo rival (bueno, no tan nuevo ya) en el barrio -Composer- (es un decir, tampoco es que sea nuevo-nuevo, pero bueno para que nos entendamos). Composer ha venido a ganarse el respeto en el barrio y lleva un tiempo peleando su reputación…e intentando expulsar a Drush del lugar bajo la atenta mirada de la comunidad. Defensores y detractores enzarzados en flames continuos para determinar que es mejor y que es peor, que debe usarse, y a que herramienta deberíamos estar mostrando más respeto.

Pero seamos realistas: no se trata de algo ajeno al mundo de la tecnología en general ni al software en particular. Siempre hay discusiones sobre las ventajas de una tecnología frente a otra (normalmente sin tener en cuenta las respectivas curvas de aprendizaje, de forma que cada cual habla desde su “expertise”). Siempre hay conflictos y debates entre versiones o herramientas de propósito específico con matices diferentes. El entorno de Drupal tampoco es especialmente ajeno a nada de ello y al margen del clásico “Wordpress vs. Drupal” existen otros debates tecnológicos. En este caso queremos poner el ojo en algunas herramientas para el trabajo con Drupal y sus necesidades: Drush, Make y Composer.

¿Qué está pasando? Bueno antes que nada, rebobinemos para dar un poco de contexto y poder ubicar este beef en un marco lo más exacto posible. ¿Quién es quién en este juego?

Empecemos por lo general (salten los ya iniciados en la materia, si quieren)

Drush

El nombre de Drush viene de la fusión de Drupal + Shell, lo que intuitivamente viene a decir que se trata de una herramienta para la gestión de Drupal desde la consola de terminal de sistemas Unix-based (Ubuntu, Debian y esas mandangas). No es un módulo de Drupal, es una herramienta de consola, vía comandos. A punto de alcanzar ya casi los diez años de vida desde su primera versión liberada para Drupal 4.7, Drush es considerada “la navaja suiza de Drupal”: básicamente es un intérprete desde la línea de comandos para desplegar, mantener y gestionar Drupal en una máquina. Con una estructura sencilla formada con una instrucción drush comando [parámetros] podíamos descargar, actualizar y activar o desactivar módulos en un proyecto o trabajando de manera global, gestionar varios en un server de producción o pre-producción y extraer backups de bases de datos con un simple drush sql-dump.

Betabeers Davidjguru drupal console drush install.JPG

Como podemos ver en la imagen superior, Drush es de fácil instalación desde la línea de comandos pero cuidado, la versión disponible en repositorios de Ubuntu no suele ser la última, así que mejor asegurarse consultando al sistema por la versión instalada. En mi caso, sobre una Ubuntu 16.04 me instaló un Drush 5.10, lo que suele provocar errores a la hora de trabajar con Drupal 8: es muy probable que se cepille completamente el fichero .htaccess y no se vea la home o a pesar de tener instalado Rewrite, no sea capaz de montar las URLs de Drupal y dé errores 404 a cada click en el menú de administración. También es seguro que lanzará mil errores por consola (PHP fatal error) al colisionar con la versión de Drupal. Solo Drush 8 puede trabajar directamente con Drupal 8. En ese caso, descargar una versión actualizada de Drush https://packagist.org/packages/drush/drush y comenzar de nuevo o bien clonar el .htaccess de algún repositorio disponible y montarlo de nuevo.

Aquí puedes clonarlo para Drupal 8 https://github.com/drupal/drupal/blob/8.0.x/.htaccess y cambiando branch a Drupal 7 lo tendrás para esa versión. De todas maneras, y con esto ya voy adelantando conclusiones, la verdad es que Drush tiene problemas de compatibilidades por todas partes si queremos usarlo con diferentes versiones de Drupal...mejor manejarlo desde Composer

Make

Make o Drush Make es una extensión de Drush que sirve para instalar configuraciones (hacer profiling) de Drupales específicos a través de un simple texto plano, de manera que parseando ese fichero de texto puede gestionar fuentes de diferentes orígenes, traerlos hasta la carpeta destino y preparar su configuración.

Básicamente, podríamos decir que sus funcionalidades consisten en:

  • Realizar descargas del core de Drupal y de módulos contribuidos desde Drupal.org

  • Traer código desde repositorios SVN, Git o Bzr.

  • Traer parches, temas,librerías externas y perfiles de instalación ya configurados

El flujo de trabajo corriente es generar un fichero .make del proyecto Drupal en el que estemos trabajando a través de drush generate-makefile proyecto.

Composer

Composer es básicamente un gestor de dependencias que trata con paquetes y librerías. Anteriormente la gente relacionada con PHP tenía que ir sitio a sitio a buscar los recursos necesarios para sus proyectos sin poder contar con un gestor de dependencias propios como el bundler de Ruby o el npm de Node.js. Inspirado en estos, se creó hace un tiempo Composer.

Básicamente podemos decir que lo que hace este gestor de herramientas es recorrer el árbol de dependencias de un proyecto de manera completa para ir a buscar todas las necesidades existentes (directas e indirectas), comprobar versiones y asegurarse de las compatibilidades de estas.

Como comentaba hace unos párrafos, es interesante gestionar todo lo relacionado con Drush desde el propio Composer:

$ composer global require drush/drush:8.*

Betabeers davidjguru drupal installing drush via composer.JPG

Ahora pasamos de nombreproyecto.make a composer.json

Conclusiones: ¿Cuál es el juego?

Gestión de dependencias

Composer localiza, maneja y comprueba el estado y las versiones de las dependencias. Se asegura de las compatibilidades con el proyecto. Drush en cambio no afronta el análisis de estado y versiones, lo que resulta un handicap al trabajar con librerías basadas en PHP que queden fuera del ecosistema propio de Drupal . Punto para Composer.

Parches y librerías

Composer da soporte a la gestión de parches y librerías externas, pero es a través de plugins añadidos y en el caso de Drush Make esta es una función básica de la herramienta. Para los parches hay que manejarse con algo como https://packagist.org/packages/cweagans/composer-patches (por ejemplo) o cuestiones de ubicación correcta de ciertas librerías asociadas a módulos, como en este plugin https://github.com/generalredneck/drupal-libraries-installer-plugin

En definitiva es necesario conocer bien que plugin necesitamos para según que, dónde se encuentra y configurarlo. Punto para Drush Make.

Madurez

Está claro que esto de la madurez de una y otra herramienta puede llegar a ser un debate complejo o al menos, difícil de asentar teniendo en cuenta que nos estamos manejando en términos abstractos. En cuestiones de edad, parece existir una diferencia significativa: Drush fue lanzado en mayo de 2007 y Composer en marzo de 2012. Uno y otro tienen más de nueve años y algo más de cuatro años respectivamente. Casi el doble de vida útil de un proyecto por parte de Drush. Es cierto que Drush tiene sus repositorios en Drupal.org y Composer para Drupal packagist.drupal-composer.org , que hay algunas limitaciones en cuanto a disponibilidad de existencia de proyectos en los repositorios de uno y otro lado, pero no es nada que no resulte insalvable en realidad.

En cuestiones de ritmo, es seguro que Composer superará a Drush Make muy pronto, ya que en términos de comunidad de desarrollo, mientras que Drush es una herramienta específica para Drupal con solo una comunidad detrás participando de su desarollo, Composer es utilizado de momento por las siguientes comunidades: Symfony, Laravel, CodeIgniter, CakePHP, Fuel y por supuesto Drupal (a partir de su versión 8).

Homogeneización

En general, parece que hay un par de claves que tenemos también que balancear: por un lado, la propia estructura de directorios interna de Drupal 8 en adelante ya viene articulada para una correcta integración con Composer. Por otro lado, se produce también una “homologación” con el resto de comunidades basadas en PHP, al usar una misma herramienta para gestionar dependencias. Esto es importante desde el punto de vista de la integración con otras tecnologías (punto fuerte de las claves de Drupal 8) ya que en realidad Drush siempre fue una herramienta construida ad-hoc para Drupal exclusivamente, y no podemos dejar de tener esto en cuenta: Composer es integración.

Conclusión

Composer ha alcanzado cierta paridad en capacidades con respecto a Drush Make. Composer es más moderno, más “estándar”, más transversal y está mejor preparado para proyectos que usen orientación a objetos.

Drush trae problemas en sus instalaciones desde repositorios oficiales por defecto en Ubuntu, y hay que modificar fuentes para integrar otros repositorios y gestionar paquetes en versiones más actualizadas. Con sus incompatibilidades en versiones si queremos trabajar en proyectos Drupal de diferente versión casi mejor gestionarlo desde Composer, que además es la herramienta recomendada para trabajar con Drupal 8, creando varios directorios, alias y realizando instalaciones de versiones diferentes de Drush en cada una.

Además en cuestión de gestión de dependencias parece ser más eficiente. A día de hoy, parece ser que Composer es ya el presente y será el futuro.

Idea

Como Drupal 8 requiere la última versión de Drush y esta conflictea con versiones antiguas de Drupal, mejor organizarse. Si tienes una especie de “Carglass” de Drupal y almacenas en tus entornos hasta proyectos basados en Drupal 6, lo mejor será tenerlo todo compartimentado y habilitar un pequeño sistema “switch” ad-hoc para versiones de Drush y todo vía composer, manteniendo una versión “global” a nivel de sistema para trabajar con Drush y el resto en sus respectivos directorios.

composer global require drush/drush:7.*

mkdir ~/drush8
cd ~/drush8
composer require drush/drush:dev-master

mkdir ~/drush7
cd ~/drush7
composer require "drush/drush:7.*"

mkdir ~/drush6
cd ~/drush6
composer require "drush/drush:6.*"

Poner un “alias” a los directorios

alias drush6='~/drush6/vendor/bin/drush'
alias drush7='~/drush7/vendor/bin/drush'
alias drush8='~/drush8/vendor/bin/drush'

Comprobar que todo va bien:

drush6 --version
drush7 --version
drush8 --version

Y a partir de aquí trabajar desde los alias

drush7 sql-sync
drush6 pm-download views



Sobre el autor

davidjguru   

Hello, my name is David (AKA Davidjguru) and I'm working as Product Owner for Drupal-based projects at Rojomorgan (@TheRojomorgan), an independent web development and design agency in Seville, Spain, in a little agile team involved with Scrum, Kanban, UX and FLOSS. I've been working with Drupal since 2010. I'm passionate about the culture of shared knowledge and free (libre) software and I have been a software developer for several years, now I'm managing customer accounts and projects based on Drupal. My responsibilities are translate to the team the concerns and thoughts of customers to get an insight into all project stakeholders . I also organize technology events like Betabeers Sevilla (@BetabeersSVQ), the local group of Drupal (@DrupalSevilla) and coordinate a pop culture blog (@CIBASS_Blog -Spanish-). Love y'all