Monorepos Multi-Dominio

En esta página

Monorepos Multi-Dominio

Ejecutar más de un sitio independiente desde un único repositorio git - digamos, un sitio de marketing y un sitio de documentación separado, o un puñado de sitios de producto que por conveniencia comparten un repositorio - no necesita nada especial de bxSites. Cada sitio es simplemente su propia raíz de proyecto: su propio bxsites.yaml más su propia carpeta de contenido, construida, servida y desplegada de forma independiente apuntando bxSites a esa única carpeta. Un "monorepo con varios dominios" es sencillamente un repositorio que contiene varias de estas raíces de proyecto, una junto a la otra.

El patrón

La propia ubicación de bxsites.yaml es siempre donde sea que apunte la raíz de proyecto explícita de la CLI - el directorio de trabajo actual, o un --projectRoot=<path> explícito (o una ruta posicional simple). No hay ninguna búsqueda ascendente de directorios ni ningún concepto separado de "raíz del repositorio" frente a "raíz del proyecto" - cada verbo simplemente resuelve una raíz de proyecto por invocación y busca bxsites.yaml (o .yml/.toml/.json) directamente dentro de ella. Un monorepo con varios dominios no es más que un repositorio que contiene varias de estas, cada una completamente independiente:

my-monorepo/
├── marketing/
│   ├── bxsites.yaml        ← source: .  (o docs - decisión propia de marketing)
│   ├── index.md
│   ├── about.md
│   └── .theme/               ← sobrescritura de tema propia de marketing, si la tiene
└── docs-site/
    ├── bxsites.yaml        ← source: docs
    └── docs/
        ├── index.md
        ├── guides/
        └── .theme/            ← sobrescritura de tema propia de docs-site, si la tiene

Cada uno de marketing/ y docs-site/ arriba es un proyecto bxSites completo y autocontenido - su propio bxsites.yaml, su propia raíz de contenido (resuelta por la propia clave source de ese proyecto, o por autodetección - consulta Origen del Contenido), y su propia sobrescritura .theme/.themes viviendo dentro de esa raíz de contenido. Nada de esto es nuevo ni específico de monorepos; es el mismo comportamiento de una-sola-raíz-de-proyecto que bxSites siempre ha tenido, solo que con más de una raíz de proyecto guardada en el mismo repositorio.

Anídalas de la forma que mejor convenga al repositorio - hermanas en la raíz (como arriba), bajo un sites/ compartido, o donde sea que tenga más sentido; a bxSites solo le importa la ruta que le pases mediante --projectRoot, no dónde esté esa ruta en relación con el resto del repositorio.

Construir un dominio

Apunta --projectRoot (o una ruta posicional simple) a la raíz de proyecto que quieras construir - todos los verbos lo aceptan, no solo build:

bxSites build --projectRoot=marketing
bxSites build --projectRoot=docs-site

Cada comando resuelve su propio bxsites.yaml, su propia raíz de contenido, y su propia sobrescritura de tema de forma totalmente independiente - construir marketing/ nunca toca el site/ de salida, la configuración, ni el tema de docs-site/, y viceversa. No hay ningún paso de construcción compartido ni ningún requisito de orden entre dominios; construye los dominios que hayan cambiado, en el orden que prefieras.

Previsualizar un dominio

serve funciona de la misma forma - previsualiza exactamente una raíz de proyecto a la vez:

bxSites serve --projectRoot=docs-site

Para previsualizar un dominio distinto, detén serve y vuelve a ejecutarlo con un --projectRoot diferente (o desde un directorio de trabajo distinto). Dos dominios que necesiten previsualización en vivo al mismo tiempo solo necesitan dos procesos serve separados, cada uno con su propio --projectRoot y (si se ejecutan simultáneamente) su propio --port.

Construir todos los dominios en CI

Como cada dominio es una invocación independiente de bxSites build --projectRoot=<path>, CI simplemente recorre en bucle la lista de raíces de proyecto:

name: Build sites
on: [push]
jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        project: [marketing, docs-site]
    steps:
      - uses: actions/checkout@v4
      - name: Install BoxLang + bx-sites
        run: |
          /bin/bash -c "$(curl -fsSL https://install.boxlang.io)"
          export BOXLANG_INSTALL_HOME="/usr/local/boxlang"
          export PATH="/root/.boxlang/bin:/usr/local/bin:$PATH"
          install-bx-module bx-sites
      - name: Build ${{ matrix.project }}
        run: bxSites build --projectRoot=${{ matrix.project }}
      - uses: actions/upload-artifact@v4
        with:
          name: site-${{ matrix.project }}
          path: ${{ matrix.project }}/site/

Un bucle bash simple funciona igual de bien fuera de una construcción con matriz, y hace fácil fallar todo el job en cuanto un dominio falla al construirse:

for project in marketing docs-site; do
	echo "Building $project..."
	bxSites build --projectRoot="$project" || exit 1
done

La propia salida site/ de cada dominio se despliega de la misma forma en que se despliega la de un proyecto de un solo sitio - consulta Despliegue - solo que una vez por dominio, apuntando a los propios deployments/*.json de ese dominio y a su propia carpeta <project>/site/.

Sin colisión entre dominios

Como .theme/.themes viven dentro de la propia raíz de contenido de cada dominio (consulta Origen del Contenido: Dónde vive una sobrescritura de tema) en lugar de en una raíz de proyecto compartida y desnuda, dos dominios en el mismo monorepo pueden cada uno llevar su propia sobrescritura de tema sin ningún riesgo de que uno tape al otro - marketing/.theme/ y docs-site/docs/.theme/ son dos carpetas completamente separadas, resueltas de forma independiente por la construcción de cada dominio. Lo mismo aplica a todo lo demás con alcance de proyecto - bxsites.yaml, deployments/*.json, docs/versions/, docs/i18n/ - la propia copia de cada dominio es exactamente la suya, sin nada compartido a menos que decidas programar tú mismo ese compartir (por ejemplo, copiando un archivo extraCss común a cada dominio antes de construir).

Editar esta página Descargar Markdown Última actualización Sep 21, 2026, 5:00:33 PM