Monorepos میں Astro 5 Glob Loader کا بگ

آپ کا Astro build کامیاب رہا۔ صفر errors۔ صفر warnings۔ لیکن آپ کا content غائب ہے۔

حال ہی میں مجھے ایک pnpm monorepo میں اس مسئلے کا سامنا کرنا پڑا۔ میں اپنے صفحات پر editorial takes شامل کرنے کے لیے Astro 5 content collections استعمال کر رہا تھا۔ مقامی طور پر (Locally)، سب کچھ بالکل ٹھیک کام کر رہا تھا۔ لیکن میرے CI pipeline میں، صفحات خالی content کے ساتھ render ہو رہے تھے۔

مسئلہ یہ ہے کہ glob loader paths کو کیسے resolve کرتا ہے۔

مسئلہ

Astro glob loader process.cwd() سے relative base paths کو resolve کرتا ہے۔ یہ آپ کی config file کی location استعمال نہیں کرتا۔

ایک monorepo میں، آپ کا CI اکثر workspace root سے build چلاتا ہے۔ مقامی طور پر، آپ غالباً app directory سے build چلاتے ہیں۔

  • Local: cwd apps/oss-alternatives ہے۔ Path ./content کام کرتا ہے۔
  • CI: cwd repository root ہے۔ Path ./content موجود نہیں ہے۔

جب Astro کو کوئی فائل نہیں ملتی تو وہ کوئی error نہیں دیتا۔ یہ محض ایک empty collection واپس کر دیتا ہے۔ آپ ڈیٹا کے بغیر سائٹ ship کر دیتے ہیں اور آپ کو اس کا علم بھی نہیں ہوتا۔

حل

Paths کے لیے relative strings کا استعمال بند کریں۔ Working directory کے بجائے اپنے paths کو config file کے ساتھ anchor کرنے کے لیے import.meta.url استعمال کریں۔

اس pattern کا استعمال کریں:

import { fileURLToPath } from "node:url";

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

یہ اس بات کو یقینی بناتا ہے کہ path ہمیشہ درست ہو، چاہے آپ build کہیں سے بھی چلائیں۔

ID Collisions سے بچیں

Glob loader ڈیفالٹ طور پر آپ کے frontmatter میں موجود slug field کو ID کے طور پر استعمال کرتا ہے۔ اگر کوئی صارف slug field شامل کر دے، تو یہ آپ کے data lookups کو خراب کر سکتا ہے۔ Filename کو authoritative ID بنانے کے لیے generateId کا استعمال کریں۔

Monorepo ڈویلپرز کے لیے اسباق

  • مقامی طور پر workspace root سے smoke tests چلائیں۔ اگر آپ صرف app folder سے ٹیسٹ کریں گے، تو آپ path bugs سے محروم رہ جائیں گے۔
  • Collection health checks شامل کریں۔ اپنے dev environment میں، اگر کوئی critical collection صفر items واپس کرے تو error throw کریں۔
  • اپنی config files میں ہر file reference کے لیے absolute path resolution استعمال کریں۔
  • یہ تصدیق کرنے کے لیے کہ اہم content لائیو HTML میں موجود ہے، ایک post-deploy check شامل کریں۔

خاموشی پر کبھی بھروسہ نہ کریں۔ ایک کامیاب build کا مطلب ہمیشہ کامیاب deployment نہیں ہوتا۔

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