Monoreposలో Astro 5 Glob Loader బగ్
మీ Astro బిల్డ్ విజయవంతమైంది. సున్నా ఎర్రర్స్ (errors). సున్నా వార్నింగ్స్ (warnings). కానీ మీ కంటెంట్ కనిపించడం లేదు.
నేను ఇటీవల ఒక pnpm monorepoలో ఈ సమస్యను ఎదుర్కొన్నాను. నా పేజీలకు ఎడిటోరియల్ టేక్స్ (editorial takes) జోడించడానికి నేను Astro 5 content collections ఉపయోగిస్తున్నాను. లోకల్లో, అంతా సరిగ్గా పనిచేసింది. కానీ నా CI పైప్లైన్లో, పేజీలు ఖాళీ కంటెంట్తో రెండర్ అయ్యాయి.
సమస్య ఏమిటంటే, glob loader పాత్లను (paths) ఎలా రిజాల్వ్ (resolve) చేస్తుంది అనేదే.
సమస్య
Astro glob loader, process.cwd() నుండి రిలేటివ్ బేస్ పాత్లను రిజాల్వ్ చేస్తుంది. ఇది మీ కాన్ఫిగరేషన్ ఫైల్ యొక్క లొకేషన్ను ఉపయోగించదు.
ఒక monorepoలో, మీ CI తరచుగా వర్క్స్పేస్ రూట్ (workspace root) నుండి బిల్డ్ను రన్ చేస్తుంది. లోకల్లో, మీరు బహుశా యాప్ డైరెక్టరీ నుండి బిల్డ్ను రన్ చేస్తారు.
- లోకల్: 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 కొలిజన్స్ (Collisions) ని నివారించండి
glob loader డిఫాల్ట్గా మీ frontmatterలోని slug ఫీల్డ్ను IDగా ఉపయోగిస్తుంది. ఒకవేళ యూజర్ slug ఫీల్డ్ను జోడిస్తే, అది మీ డేటా లుకప్లను (data lookups) దెబ్బతీస్తుంది. ఫైల్ నేమ్ మాత్రమే అధికారిక IDగా ఉండేలా చేయడానికి generateId ఉపయోగించండి.
Monorepo డెవలపర్ల కోసం పాఠాలు
- లోకల్లో వర్క్స్పేస్ రూట్ నుండి స్మోక్ టెస్ట్లను (smoke tests) రన్ చేయండి. మీరు కేవలం యాప్ ఫోల్డర్ నుండి మాత్రమే టెస్ట్ చేస్తే, పాత్ బగ్స్ను గుర్తించలేరు.
- కలెక్షన్ హెల్త్ చెక్లను (health checks) జోడించండి. మీ డెవ్ ఎన్విరాన్మెంట్లో (dev environment), ఏదైనా ముఖ్యమైన కలెక్షన్ సున్నా ఐటెమ్స్ను రిటర్న్ చేస్తే ఎర్రర్ను చూపించేలా చేయండి.
- మీ కాన్ఫిగరేషన్ ఫైల్స్లోని ప్రతి ఫైల్ రిఫరెన్స్కు అబ్సల్యూట్ పాత్ రిజల్యూషన్ (absolute path resolution) ఉపయోగించండి.
- లైవ్ HTMLలో ముఖ్యమైన కంటెంట్ ఉందో లేదో తనిఖీ చేయడానికి పోస్ట్-డిప్లాయ్ (post-deploy) చెక్ను జోడించండి.
నిశ్శబ్దాన్ని ఎప్పుడూ నమ్మకండి. బిల్డ్ విజయవంతమైందంటేనే డిప్లాయ్మెంట్ కూడా విజయవంతమైందని కాదు.
