Bug do Glob Loader do Astro 5 em Monorepos
Seu build do Astro passou. Zero erros. Zero avisos. Mas seu conteúdo está faltando.
Recentemente, enfrentei esse problema em um monorepo pnpm. Eu estava usando as content collections do Astro 5 para adicionar comentários editoriais às minhas páginas. Localmente, tudo funcionava perfeitamente. No meu pipeline de CI, as páginas eram renderizadas com conteúdo vazio.
O problema é como o glob loader resolve os caminhos.
O Problema O glob loader do Astro resolve caminhos relativos a partir do process.cwd(). Ele não utiliza a localização do seu arquivo de configuração.
Em um monorepo, seu CI geralmente executa o build a partir da raiz do workspace. Localmente, você provavelmente executa o build a partir do diretório do app.
- Local: o cwd é apps/oss-alternatives. O caminho ./content funciona.
- CI: o cwd é a raiz do repositório. O caminho ./content não existe.
O Astro não lança um erro quando não encontra arquivos. Ele simplesmente retorna uma coleção vazia. Você publica um site com dados ausentes e nem percebe.
A Solução Pare de usar strings relativas para caminhos. Use import.meta.url para ancorar seus caminhos ao arquivo de configuração em vez do diretório de trabalho.
Use este padrão:
import { fileURLToPath } from "node:url";
const TAKES_DIR = fileURLToPath( new URL("./content/per-alternative-takes", import.meta.url) );
Isso garante que o caminho esteja sempre correto, não importa de onde você execute o build.
Evite Colisões de ID O glob loader usa o campo slug no seu frontmatter como o ID por padrão. Se um usuário adicionar um campo slug, isso pode quebrar suas buscas de dados. Use generateId para forçar o nome do arquivo a ser o ID definitivo.
Lições para Desenvolvedores de Monorepos
- Execute smoke tests a partir da raiz do workspace localmente. Se você testar apenas a partir da pasta do app, deixará passar bugs de caminho.
- Adicione health checks para as coleções. Em seu ambiente de desenvolvimento, lance um erro se uma coleção crítica retornar zero itens.
- Use resolução de caminho absoluto para cada referência de arquivo em seus arquivos de configuração.
- Adicione uma verificação post-deploy para verificar se o conteúdo essencial existe no HTML publicado.
Nunca confie no silêncio. Um build bem-sucedido nem sempre significa uma implantação bem-sucedida.
