Monorepos ਵਿੱਚ Astro 5 Glob Loader ਬੱਗ
ਤੁਹਾਡਾ Astro build ਸਫਲ ਰਿਹਾ। ਜ਼ੀਰੋ ਗਲਤੀਆਂ। ਜ਼ੀਰੋ ਚੇਤਾਵਨੀਆਂ। ਪਰ ਤੁਹਾਡਾ ਕੰਟੈਂਟ ਗਾਇਬ ਹੈ।
ਮੈਂ ਹਾਲ ਹੀ ਵਿੱਚ ਇੱਕ pnpm monorepo ਵਿੱਚ ਇਸ ਸਮੱਸਿਆ ਦਾ ਸਾਹਮਣਾ ਕੀਤਾ। ਮੈਂ ਆਪਣੇ ਪੇਜਾਂ ਵਿੱਚ editorial takes ਜੋੜਨ ਲਈ Astro 5 content collections ਦੀ ਵਰਤੋਂ ਕਰ ਰਿਹਾ ਸੀ। ਸਥਾਨਕ ਤੌਰ 'ਤੇ (Locally), ਸਭ ਕੁਝ ਬਿਲਕੁਲ ਸਹੀ ਕੰਮ ਕਰ ਰਿਹਾ ਸੀ। ਪਰ ਮੇਰੇ CI pipeline ਵਿੱਚ, ਪੇਜ ਖਾਲੀ ਕੰਟੈਂਟ ਨਾਲ ਰੈਂਡਰ ਹੋਏ।
ਸਮੱਸਿਆ ਇਹ ਹੈ ਕਿ glob loader ਪਾਥਾਂ (paths) ਨੂੰ ਕਿਵੇਂ ਰੈਜ਼ੋਲਵ (resolve) ਕਰਦਾ ਹੈ।
ਸਮੱਸਿਆ
Astro glob loader relative base paths ਨੂੰ process.cwd() ਤੋਂ ਰੈਜ਼ੋਲਵ ਕਰਦਾ ਹੈ। ਇਹ ਤੁਹਾਡੀ config ਫਾਈਲ ਦੀ ਲੋਕੇਸ਼ਨ ਦੀ ਵਰਤੋਂ ਨਹੀਂ ਕਰਦਾ।
ਇੱਕ monorepo ਵਿੱਚ, ਤੁਹਾਡਾ CI ਅਕਸਰ workspace root ਤੋਂ build ਚਲਾਉਂਦਾ ਹੈ। ਸਥਾਨਕ ਤੌਰ 'ਤੇ, ਤੁਸੀਂ ਸ਼ਾਇਦ app directory ਤੋਂ build ਚਲਾਉਂਦੇ ਹੋ।
- Local: cwd
apps/oss-alternativesਹੈ। ਪਾਥ./contentਕੰਮ ਕਰਦਾ ਹੈ। - CI: cwd ਰਿਪੋਜ਼ਟਰੀ ਰੂਟ (repository root) ਹੈ। ਪਾਥ
./contentਮੌਜੂਦ ਨਹੀਂ ਹੈ।
ਜਦੋਂ Astro ਨੂੰ ਕੋਈ ਫਾਈਲ ਨਹੀਂ ਮਿਲਦੀ, ਤਾਂ ਇਹ ਕੋਈ ਗਲਤੀ (error) ਨਹੀਂ ਦਿੰਦਾ। ਇਹ ਸਿਰਫ਼ ਇੱਕ ਖਾਲੀ collection ਰਿਟਰਨ ਕਰਦਾ ਹੈ। ਤੁਸੀਂ ਡੇਟਾ ਤੋਂ ਬਿਨਾਂ ਇੱਕ ਸਾਈਟ ਲਾਂਚ ਕਰ ਦਿੰਦੇ ਹੋ ਅਤੇ ਤੁਹਾਨੂੰ ਇਸ ਬਾਰੇ ਕਦੇ ਪਤਾ ਹੀ ਨਹੀਂ ਲੱਗਦਾ।
ਹੱਲ
ਪਾਥਾਂ ਲਈ relative strings ਦੀ ਵਰਤੋਂ ਕਰਨਾ ਬੰਦ ਕਰੋ। 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 Collisions ਤੋਂ ਬਚੋ
Glob loader ਡਿਫੌਲਟ ਰੂਪ ਵਿੱਚ ਤੁਹਾਡੇ frontmatter ਵਿੱਚ slug ਫੀਲਡ ਨੂੰ ID ਵਜੋਂ ਵਰਤਦਾ ਹੈ। ਜੇਕਰ ਕੋਈ ਯੂਜ਼ਰ slug ਫੀਲਡ ਜੋੜਦਾ ਹੈ, ਤਾਂ ਇਹ ਤੁਹਾਡੇ ਡੇਟਾ ਲੁੱਕਅਪ (data lookups) ਨੂੰ ਖਰਾਬ ਕਰ ਸਕਦਾ ਹੈ। ਫਾਈਲ ਦੇ ਨਾਮ ਨੂੰ ਅਧਿਕਾਰਤ ID ਬਣਾਉਣ ਲਈ generateId ਦੀ ਵਰਤੋਂ ਕਰੋ।
Monorepo ਡਿਵੈਲਪਰਾਂ ਲਈ ਸਬਕ
- ਸਥਾਨਕ ਤੌਰ 'ਤੇ workspace root ਤੋਂ smoke tests ਚਲਾਓ। ਜੇਕਰ ਤੁਸੀਂ ਸਿਰਫ਼ app ਫੋਲਡਰ ਤੋਂ ਟੈਸਟ ਕਰਦੇ ਹੋ, ਤਾਂ ਤੁਸੀਂ ਪਾਥ ਬੱਗ (path bugs) ਨੂੰ ਮਿਸ ਕਰ ਸਕਦੇ ਹੋ।
- Collection health checks ਜੋੜੋ। ਆਪਣੇ dev environment ਵਿੱਚ, ਜੇਕਰ ਕੋਈ ਮਹੱਤਵਪੂਰਨ collection ਜ਼ੀਰੋ ਆਈਟਮਾਂ ਰਿਟਰਨ ਕਰਦਾ ਹੈ, ਤਾਂ error ਦਿਓ।
- ਆਪਣੀਆਂ config ਫਾਈਲਾਂ ਵਿੱਚ ਹਰ ਫਾਈਲ ਰੈਫਰੈਂਸ ਲਈ absolute path resolution ਦੀ ਵਰਤੋਂ ਕਰੋ।
- ਇਹ ਪੁਸ਼ਟੀ ਕਰਨ ਲਈ ਕਿ ਲਾਈਵ HTML ਵਿੱਚ ਮੁੱਖ ਕੰਟੈਂਟ ਮੌਜੂਦ ਹੈ, ਇੱਕ post-deploy ਚੈੱਕ ਜੋੜੋ।
ਕਦੇ ਵੀ ਚੁੱਪ (silence) 'ਤੇ ਭਰੋਸਾ ਨਾ ਕਰੋ। ਇੱਕ ਸਫਲ build ਦਾ ਮਤਲਬ ਹਮੇਸ਼ਾ ਸਫਲ deployment ਨਹੀਂ ਹੁੰਦਾ।
