Баг glob-загрузчика Astro 5 в монорепозиториях
Ваша сборка Astro прошла успешно. Ноль ошибок. Ноль предупреждений. Но ваш контент отсутствует.
Недавно я столкнулся с этой проблемой в pnpm монорепозитории. Я использовал Astro 5 content collections, чтобы добавлять редакционные заметки на свои страницы. Локально всё работало идеально. В моем CI-конвейере страницы рендерились с пустым контентом.
Проблема заключается в том, как glob-загрузчик разрешает пути.
Проблема
Glob-загрузчик Astro разрешает относительные базовые пути от process.cwd(). Он не использует расположение вашего конфигурационного файла.
В монорепозитории ваш CI часто запускает сборку из корня воркспейса. Локально вы, скорее всего, запускаете сборку из директории приложения.
- Локально:
cwd—apps/oss-alternatives. Путь./contentработает. - CI:
cwd— корень репозитория. Пути./contentне существует.
Astro не выдает ошибку, если не находит файлов. Он просто возвращает пустую коллекцию. В итоге вы выпускаете сайт с отсутствующими данными и даже не подозреваете об этом.
Решение
Перестаньте использовать относительные строки для путей. Используйте import.meta.url, чтобы привязать пути к конфигурационному файлу, а не к рабочей директории.
Используйте этот паттерн:
import { fileURLToPath } from "node:url";
const TAKES_DIR = fileURLToPath(
new URL("./content/per-alternative-takes", import.meta.url)
);
Это гарантирует, что путь всегда будет верным, независимо от того, откуда вы запускаете сборку.
Избегайте коллизий ID
По умолчанию glob-загрузчик использует поле slug в вашем frontmatter в качестве ID. Если пользователь добавит поле slug, это может нарушить поиск данных. Используйте generateId, чтобы принудительно сделать имя файла основным ID.
Уроки для разработчиков монорепозиториев
- Запускайте smoke-тесты локально из корня воркспейса. Если вы тестируете только из папки приложения, вы пропустите баги с путями.
- Добавьте проверки работоспособности коллекций. В среде разработки выбрасывайте ошибку, если критически важная коллекция возвращает ноль элементов.
- Используйте разрешение абсолютных путей для каждой ссылки на файл в ваших конфигурационных файлах.
- Добавьте проверку после развертывания (post-deploy), чтобы убедиться, что ключевой контент присутствует в опубликованном HTML.
Никогда не доверяйте тишине. Успешная сборка не всегда означает успешное развертывание.
