Repositorios Privados para Composer
Lleva a tu equipo al siguiente nivel con Satis
Reutilización, Reutilización, y Reutilización!
En una época en donde el desarrollo ágil de aplicaciones está a la vanguardia, más que nunca se necesita la posibilidad de reutilizar código y funcionalidades comunes de una manera eficiente.
Muchas veces pensamos que escribir código desacoplado solo es conveniente cuando desarrollamos librerías, pero la verdad es que deberíamos pensar en nuestra aplicación como una librería en sí misma, sobretodo si se trata de aplicaciones complejas.
Proyectos complejos donde la integración es fundamental, por ejemplo, necesitan de interfaces y clases comunes para desarrollar tales funcionalidades. Disponibilizar tales interfaces como piezas separadas de la lógica de negocio es fundamental para lograr aplicaciones arquitecturalmente saludables: aplicaciones flexibles, resistentes al cambio y fácilmente escalables.
Estudio de Caso: Omnipay
Hace poco me topé con una librería excelentemente desarrollada, llamada Omnipay. Es una librería que abstrae diferentes portales de pago bajo una interfaz común. Lo interesante, es que para desarrollar tu propia integración, debes requerir un paquete llamado omnipay/common
, que contiene los componentes básicos para desarrollar tu integración, pero nada de la lógica de la librería en sí. Eso es un buen ejemplo de cómo desarrollar una integración lo más desacoplada posible. Las lógica de la librería vive separada de la interfaz de la misma. Incluso, sería fácil crear otra implementación de la librería manteniendo la misma interfaz, y nada se rompería.
¿No sería genial comenzar a desarrollar nuestras aplicaciones de esta forma? Integraciones que cuenten con un core, o interfaz común, sin tener miedo de utilizar todas las bondades que nos entregan los gestores de paquetes y requerirlas en nuestras aplicaciones. Desarrollar aplicaciones desacopladas requiere esfuerzo, pero como programador es lo mejor que puedes hacer.
Por supuesto, nuestra aplicación sería más compleja que simplemente abstraer portales de pago, o sistemas de archivos locales o en la nube (como lo hace Flysystem). Pero que tal si tu aplicación integra, por ejemplo, múltiples sistemas que poseen datos que necesitan ser compartidos, como escuelas o centros médicos. Allí es cuando los esfuerzos de desarrollar una aplicación estructuralmente sólida se probarán los más valiosos que jamás hayas realizado.
Dividir una aplicación en múltiples librerías e interfaces comunes te dará un poco de dolores de cabeza inicialmente, pero te quitará las migrañas y horas de sueño perdidas que vendrán en el futuro.
La “Ley de Código Compartido”
Si tu proyecto poseyera una sola dependencia, entonces estaría bien simplemente tomar un zip y colocarlo en tu vendor. Pero si tu proyecto requiere la rápida integración de dependencias y la posibilidad de manejarlas fácilmente, entonces necesitas un package manager.
Esto, porque mientras más librerías y código compartido requieras, más eficientes deben ser tus procesos de manejo de dependencias.
Composer, el gestor de dependencias por antonomasia para PHP, te permite hacer esto muy bien. Basta un simple composer require
y ya puedes obtener cualquiera de las librerías que están en Packagist. Sin embargo, ¿qué pasa si tu compañía quiere compartir código propietario?
Aquí es cuando muchos equipos dejan de interesarse en la idea de modularizar sus aplicaciones en pequeños paquetes. Es muy complejo tener que manejar llaves privadas, y llenar tu composer.json
de un montón de repositories apuntando a miles de otras repos vcs. Simplemente, no es eficiente.
¡Composer y Satis al rescate!
Satis es una aplicación desarrollada por el equipo de Composer, que permite crear repositorios privados en un servidor. Se instala muy fácilmente:
composer create-project composer/satis Satis --keep-vcs
Esto instalará Satis en la carpeta Satis. El --keep-vcs
mantendrá el repositorio git cuando el paquete sea descargado.
Satis funciona de la siguiente manera: Primero, debes definir su índice de repositorios creando un archivo de configuración. Luego, debes correr el comando que irá a escanear esos repositorios, y luego de que todos los repositorios han sido escaneados, puedes proceder a visitar el web server que los contiene.
El archivo de configuración de Satis es bastante sencillo:
{ "name": "El Repositorio de tu Empresa", "homepage": "http://direcciondeturepo.com", "repositories": [ { "type": "vcs", "url": "git@bitbucket.org:myproject/myrepo.git" }, { "type": "vcs", "url": "git@your-company-gitlab.com:repo/repo.git" } ], "require-all": true, "require-dependencies": true, "archive": { "directory": "dist", "format": "tar", "skip-dev": true }}
Primero definimos un nombre y una url para nuestro repositorio. Luego, definimos los repositorios que Satis tiene que incluir, que pueden estar en cualquier lugar que quieras. Posteriormente, le decimos con require-all
que queremos incluir todas las etiquetas o versiones de estos paquetes, y sus dependencias (require-dependencies
) y luego le pasamos un poco de información sobre el archivo, como la ubicación del directorio y el formato.
Guardamos el archivo como satis.json en nuestro root directory.
Luego, para comenzar el escaneo de paquetes y la creación del índice, podemos ejecutar:
php bin/satis build satis.json public/
El public
al final es la carpeta donde se creará la interfaz web para ver nuestros repositorios. Si ejecutas el servidor web integrado de PHP sobre la carpeta public y vas a localhost, debería verse algo como esto, con mi propia configuración de Satis.
Luego puedes colocar la carpeta public detrás de un servidor web, y colocar un token de autenticación para proteger tus paquetes de descarga. Hay muchas más información en la documentación oficial de Composer.
Lo único que queda por hacer para tu equipo, es simplemente añadir a su composer.json
el repositorio indicado y composer irá automáticamente resolviendo cualquier dependencia necesaria que se requiera.
Ahora, solo llena ese repositorio con paquetes del Gitlab de tu empresa, o crea un sistema más complejo de administración, para liberar todo el poder colaborativo de gestión de dependencias dentro de tu empresa.
How cool is that?