Monorepo multi-dominio

In questa pagina

Monorepo multi-dominio

Eseguire più di un sito indipendente da un unico repository git - ad esempio un sito marketing e un sito di documentazione separato, oppure una manciata di siti prodotto che per comodità condividono un solo repository - non richiede nulla di speciale da bxSites. Ogni sito è semplicemente una propria project root: un proprio bxsites.yaml più una propria cartella di contenuto, compilato, servito e distribuito in modo indipendente puntando bxSites su quell'unica cartella. Un "monorepo con più domini" è semplicemente un repository che contiene diverse di queste project root fianco a fianco.

Lo schema

La posizione propria di bxsites.yaml è sempre dove punta la project root esplicita della CLI - la directory di lavoro corrente, oppure un --projectRoot=<path> esplicito (o un percorso posizionale nudo). Non c'è alcuna ricerca verso l'alto nelle directory e nessun concetto separato di "radice del repository" rispetto a "project root" - ogni verbo risolve semplicemente una project root per invocazione e cerca bxsites.yaml (o .yml/.toml/.json) direttamente al suo interno. Un monorepo con più domini non è altro che un repository che ne contiene diverse, ognuna indipendentemente completa:

my-monorepo/
├── marketing/
│   ├── bxsites.yaml        ← source: .  (oppure docs - scelta propria di marketing)
│   ├── index.md
│   ├── about.md
│   └── .theme/               ← sovrascrittura di tema propria di marketing, se presente
└── docs-site/
    ├── bxsites.yaml        ← source: docs
    └── docs/
        ├── index.md
        ├── guides/
        └── .theme/            ← sovrascrittura di tema propria di docs-site, se presente

Ognuna di marketing/ e docs-site/ sopra è un progetto bxSites completo e autonomo - il proprio bxsites.yaml, la propria content root (risolta dalla chiave source di quel progetto, o dal rilevamento automatico - vedi Origine del contenuto), e la propria sovrascrittura .theme/.themes che vive dentro quella content root. Niente qui è nuovo o specifico dei monorepo; è lo stesso comportamento a singola project root che bxSites ha sempre avuto, solo con più di una project root nello stesso repository.

Annidale come preferisci per il repository - come fratelli alla radice (come sopra), sotto un genitore sites/ condiviso, o dove altro abbia senso; a bxSites interessa solo il percorso che gli passi tramite --projectRoot, non dove quel percorso si trova rispetto al resto del repository.

Compilare un dominio

Punta --projectRoot (o un percorso posizionale nudo) alla project root che vuoi compilare - ogni verbo lo accetta, non solo build:

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

Ogni comando risolve il proprio bxsites.yaml, la propria content root e la propria sovrascrittura di tema in modo interamente indipendente - compilare marketing/ non tocca mai il proprio output site/, la configurazione o il tema di docs-site/, e viceversa. Non c'è alcun passaggio di build condiviso né alcun requisito di ordinamento cross-dominio; compila qualunque dominio sia cambiato, nell'ordine che preferisci.

Anteprima di un dominio

serve funziona allo stesso modo - fa l'anteprima di esattamente una project root alla volta:

bxSites serve --projectRoot=docs-site

Per fare l'anteprima di un dominio diverso, ferma serve ed eseguilo di nuovo con un --projectRoot diverso (oppure da una directory di lavoro diversa). Due domini che hanno entrambi bisogno di un'anteprima dal vivo contemporaneamente richiedono semplicemente due processi serve separati, ciascuno con il proprio --projectRoot e (se eseguiti insieme) la propria --port.

Compilare ogni dominio in CI

Dato che ogni dominio è un'invocazione indipendente di bxSites build --projectRoot=<path>, la CI si limita a scorrere in loop sull'elenco delle project root:

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 semplice loop bash funziona altrettanto bene fuori da una matrix build, e rende facile far fallire l'intero job non appena un dominio qualsiasi non riesce a compilarsi:

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

L'output site/ proprio di ogni dominio viene distribuito allo stesso modo dell'output di un progetto a singolo sito - vedi Distribuzione - solo una volta per dominio, puntato sui propri deployments/*.json e sulla propria cartella <project>/site/.

Nessuna collisione cross-dominio

Poiché .theme/.themes vivono dentro la content root propria di ogni dominio (vedi Origine del contenuto: Dove vive una sovrascrittura di tema) invece che a una project root nuda e condivisa, due domini nello stesso monorepo possono portare ciascuno la propria sovrascrittura di tema senza alcun rischio che l'uno oscuri l'altro - marketing/.theme/ e docs-site/docs/.theme/ sono due cartelle interamente separate, risolte in modo indipendente dalla build propria di ogni dominio. Lo stesso vale per tutto il resto a livello di progetto - bxsites.yaml, deployments/*.json, docs/versions/, docs/i18n/ - la copia propria di ogni dominio è esattamente quella di quel dominio, senza nulla di condiviso a meno che tu scelga di scriptare la condivisione da solo (ad esempio, copiando un file extraCss comune in ogni dominio prima di compilare).

Modifica questa pagina Scarica Markdown Ultimo aggiornamento Sep 21, 2026, 5:00:33 PM