Monorepo-তে Astro 5 Glob Loader-এর বাগ

আপনার Astro build সফল হয়েছে। কোনো error নেই। কোনো warning নেই। কিন্তু আপনার কন্টেন্ট নেই।

সম্প্রতি আমি একটি pnpm monorepo-তে এই সমস্যার সম্মুখীন হয়েছি। আমি আমার পেজগুলোতে editorial takes যোগ করার জন্য Astro 5 content collections ব্যবহার করছিলাম। লোকালি, সবকিছু ঠিকঠাক কাজ করছিল। কিন্তু আমার CI pipeline-এ, পেজগুলো খালি কন্টেন্ট নিয়ে রেন্ডার হচ্ছিল।

সমস্যাটি হলো glob loader কীভাবে পাথ (path) resolve করে।

সমস্যাটি (The Issue)

Astro glob loader process.cwd() থেকে relative base path resolve করে। এটি আপনার config ফাইলের লোকেশন ব্যবহার করে না।

একটি monorepo-তে, আপনার CI প্রায়শই workspace root থেকে build চালায়। লোকালি, আপনি সম্ভবত app directory থেকে build চালান।

  • Local: cwd হলো apps/oss-alternatives./content পাথটি কাজ করে।
  • CI: cwd হলো repository root। ./content পাথটি সেখানে নেই।

কোনো ফাইল না পেলে Astro কোনো error দেয় না। এটি কেবল একটি empty collection রিটার্ন করে। ফলে আপনি ডেটা ছাড়া একটি সাইট রিলিজ করে দেন এবং আপনি তা বুঝতেও পারেন না।

সমাধান (The Fix)

পাথের জন্য relative string ব্যবহার করা বন্ধ করুন। working directory-র পরিবর্তে আপনার পাথগুলোকে config ফাইলের সাথে যুক্ত করতে import.meta.url ব্যবহার করুন।

এই প্যাটার্নটি ব্যবহার করুন:

import { fileURLToPath } from "node:url";

const TAKES_DIR = fileURLToPath(
  new URL("./content/per-alternative-takes", import.meta.url)
);

এটি নিশ্চিত করে যে আপনি যেখান থেকেই build চালান না কেন, পাথটি সবসময় সঠিক থাকবে।

ID Collision এড়ানো

Glob loader ডিফল্টভাবে আপনার frontmatter-এর slug ফিল্ডটিকে ID হিসেবে ব্যবহার করে। যদি কোনো ইউজার একটি slug ফিল্ড যোগ করেন, তবে তা আপনার data lookup নষ্ট করে দিতে পারে। ফাইলনামটিকে মূল ID হিসেবে ব্যবহার করতে generateId ব্যবহার করুন।

Monorepo ডেভেলপারদের জন্য শিক্ষা

  • লোকালি workspace root থেকে smoke test চালান। আপনি যদি শুধুমাত্র app folder থেকে টেস্ট করেন, তবে পাথ সংক্রান্ত বাগ (bug) মিস করতে পারেন।
  • collection health check যোগ করুন। আপনার dev environment-এ, যদি কোনো গুরুত্বপূর্ণ collection শূন্য আইটেম রিটার্ন করে, তবে একটি error throw করুন।
  • আপনার config ফাইলগুলোর প্রতিটি file reference-এর জন্য absolute path resolution ব্যবহার করুন।
  • লাইভ HTML-এ মূল কন্টেন্ট আছে কিনা তা যাচাই করতে একটি post-deploy check যোগ করুন।

নীরবতাকে কখনো বিশ্বাস করবেন না। একটি সফল build মানেই সবসময় সফল deployment নয়।

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