Баг glob-загрузчика Astro 5 в монорепозиториях

Ваша сборка Astro прошла успешно. Ноль ошибок. Ноль предупреждений. Но ваш контент отсутствует.

Недавно я столкнулся с этой проблемой в pnpm монорепозитории. Я использовал Astro 5 content collections, чтобы добавлять редакционные заметки на свои страницы. Локально всё работало идеально. В моем CI-конвейере страницы рендерились с пустым контентом.

Проблема заключается в том, как glob-загрузчик разрешает пути.

Проблема

Glob-загрузчик Astro разрешает относительные базовые пути от process.cwd(). Он не использует расположение вашего конфигурационного файла.

В монорепозитории ваш CI часто запускает сборку из корня воркспейса. Локально вы, скорее всего, запускаете сборку из директории приложения.

  • Локально: cwdapps/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.

Никогда не доверяйте тишине. Успешная сборка не всегда означает успешное развертывание.

Source: https://dev.to/morinaga/what-i-learned-about-astro-5-glob-loader-path-resolution-in-a-pnpm-monorepo-2ed4