Bug du glob loader d'Astro 5 dans les monorepos
Votre build Astro a réussi. Zéro erreur. Zéro avertissement. Mais votre contenu est manquant.
J'ai récemment rencontré ce problème dans un monorepo pnpm. J'utilisais les content collections d'Astro 5 pour ajouter des éditoriaux à mes pages. En local, tout fonctionnait parfaitement. Dans mon pipeline CI, les pages s'affichaient avec un contenu vide.
Le problème réside dans la manière dont le glob loader résout les chemins.
Le problème
Le glob loader d'Astro résout les chemins relatifs à partir de process.cwd(). Il n'utilise pas l'emplacement de votre fichier de configuration.
Dans un monorepo, votre CI exécute souvent le build depuis la racine du workspace. En local, vous lancez probablement le build depuis le répertoire de l'application.
- Local : le cwd est
apps/oss-alternatives. Le chemin./contentfonctionne. - CI : le cwd est la racine du dépôt. Le chemin
./contentn'existe pas.
Astro ne renvoie pas d'erreur lorsqu'il ne trouve aucun fichier. Il renvoie simplement une collection vide. Vous déployez un site avec des données manquantes sans même le savoir.
La solution
Arrêtez d'utiliser des chaînes de caractères relatives pour les chemins. Utilisez import.meta.url pour ancrer vos chemins au fichier de configuration plutôt qu'au répertoire de travail.
Utilisez ce modèle :
import { fileURLToPath } from "node:url";
const TAKES_DIR = fileURLToPath(
new URL("./content/per-alternative-takes", import.meta.url)
);
Cela garantit que le chemin est toujours correct, peu importe d'où vous lancez le build.
Éviter les collisions d'ID
Par défaut, le glob loader utilise le champ slug de votre frontmatter comme ID. Si un utilisateur ajoute un champ slug, cela peut briser vos recherches de données. Utilisez generateId pour forcer le nom du fichier à être l'ID faisant foi.
Leçons pour les développeurs de monorepos
- Exécutez des tests de fumée (smoke tests) depuis la racine du workspace en local. Si vous ne testez que depuis le dossier de l'application, vous passerez à côté des bugs de chemin.
- Ajoutez des contrôles de santé (health checks) pour vos collections. Dans votre environnement de développement, générez une erreur si une collection critique renvoie zéro élément.
- Utilisez la résolution de chemins absolus pour chaque référence de fichier dans vos fichiers de configuration.
- Ajoutez une vérification post-déploiement pour vérifier que le contenu clé est présent dans le HTML en ligne.
Ne faites jamais confiance au silence. Un build réussi ne signifie pas toujours un déploiement réussi.
