Ir al contenido principal
Laravel, shipping fast.

Capitulo 18

Publicar plantillas en sitios activos

Julian Beaujardin

Cada capítulo anterior construyó una API bien hecha. Un repositorio, un destino de despliegue, un equipo leyendo un conjunto de convenciones. Ese es el caso fácil, y todo lo de este capítulo se rompe en cuanto deja de ser cierto.

El caso difícil: tu plataforma no sólo sirve peticiones, genera otras aplicaciones en ejecución. Cada una es un sitio Laravel vivo, clonado de un esqueleto compartido, en su propio repositorio, desplegado en su propia máquina, editado por un cliente real desde un navegador. Ya no posees una API: posees una flota, y cada miembro tiene que seguir comportándose como si perteneciera al mismo sistema meses después de que publicaras el código que lo creó.

Distribuir es un problema más difícil que construir. Construir la cosa una vez es la parte que cubre cualquier tutorial. Hacer llegar un cambio a cada copia ya en ejecución, con seguridad y en tu calendario, es la parte que decide si tu plataforma escala más allá de una docena de clientes.

Tres niveles, tres cadencias

Empieza por la forma del problema. Un sitio generado no es un artefacto: es la composición de tres.

  1. Un repositorio esqueleto, clonado una vez por instancia de cliente: la aplicación Laravel en sí. Cambia rara vez, porque cada cambio hay que volver a clonarlo o reconciliarlo a mano en cada instancia que ya existe.
  2. Un paquete instalado en ese esqueleto, que entrega el producto de verdad: el tema, el sistema de contenido editable, los componentes Blade con los que se construye el sitio. Versionado de forma independiente, traído por Composer como cualquier otra dependencia.
  3. Un alojamiento de recursos estáticos, sirviendo el código de cliente al que hace referencia el paquete instalado, con su propia cadencia de publicación completamente separada de las otras dos.
template-base (cloned once per customer)
    ↓ composer install
webplo/templates (theme + editable system, versioned package)
    ↓ ships client-side code hosted on
cdn (static assets, its own release cadence)

El esqueleto responde a «qué es esta aplicación, estructuralmente». El paquete responde a «qué aspecto tiene y qué hace hoy». El CDN responde a «qué código de navegador carga la página ahora mismo». Junta esas tres preguntas en un repositorio y cada respuesta cambia al ritmo de la más lenta: un retoque de una línea de CSS exige ahora volver a clonar un esqueleto de Laravel en una docena de repositorios de clientes. Sepáralas y cada nivel se mueve exactamente a la velocidad que su propia pregunta necesita.

Merece la pena ser honesto sobre lo que cuesta ese «cambia rara vez». El esqueleto todavía instancia a mano la aplicación al estilo anterior a Laravel 11, aunque su composer.json fija la misma versión moderna del framework que corre el resto de la flota con el esqueleto nuevo. Nadie pierde el sueño por eso. Es el coste predecible de un nivel deliberadamente difícil de tocar: nunca compensa el riesgo de una migración estructural, porque ya no vive ahí nada del producto. Un compromiso funcionando según lo diseñado, no un fallo que encontrarías buscando mejor.