كيف نختار أداة التثبيت
نختار من كودك، وأول تطابق هو المعتمد:
- الحقل
packageManagerفيpackage.json، مثل[email protected]. - ملف قفل بهذا الترتيب:
pnpm-lock.yaml، ثمbun.lockأوbun.lockb، ثمyarn.lock. - الملف
.yarnrc.yml، أي Yarn 2 أو أحدث. engines.pnpmأوengines.bunأوengines.yarnفيpackage.json.- وإلا فـ npm، مع
package-lock.jsonأوnpm-shrinkwrap.jsonإذا وُجد.
وهذا أمر التثبيت لكل أداة، مع ملف القفل ثم دونه:
- npm:
npm ci، أوnpm install. - pnpm:
corepack pnpm install --frozen-lockfile، أوcorepack pnpm install. - Yarn 1:
corepack yarn install --frozen-lockfile، أوcorepack yarn install. - Yarn 2 أو أحدث:
corepack yarn install --immutable، أوcorepack yarn install --no-immutable. - Bun:
bun install --frozen-lockfile، أوbun install.
يشغّل Corepack أداتي pnpm و Yarn بالإصدار المكتوب في packageManager. وارفع ملف القفل دائمًا، فبدونه قد يثبّت النشر إصدارات مكتبات لم تجربها.
ولا نعيد التثبيت إلا عند تغيّر أمر التثبيت أو إصدار Node أو package.json أو ملف القفل، وإلا يظهر في الكونسول dependencies are up to date (npm).
البناء
إذا كان في package.json سكربت build، نشغّله بعد التثبيت بالأداة نفسها، مثل npm run build، في كل نشر، ولا نعيده عند الريستارت العادي. يظهر في الكونسول building: npm run build ثم build finished، وإذا فشل البناء يتوقف النشر في مرحلة build. ولأمر بناء مختلف، اكتبه في الحقل build في serverk.json.
أمر ما قبل النشر
يشتغل أمر ما قبل النشر مرة واحدة في كل نشر، بعد التثبيت والبناء وقبل تشغيل بوتك، وهو مكان ترحيلات قاعدة البيانات. نشغّله في مجلد الكود بمتغيرات بوتك نفسها، و node_modules/.bin في المسار، فيعمل أمر مثل prisma migrate deploy كما هو. ولا نعيده عند الريستارت العادي، وإذا فشل النشر نشغّله من جديد في التشغيل التالي للنشر نفسه.
أول تطابق هو المعتمد:
- أمر ما قبل النشر في إعدادات بوتك.
- الحقل
preDeployفيserverk.json. prisma migrate deployإذا كان في كودك الملفprisma/migrations/migration_lock.toml. وأبقِprismaفي مكتباتpackage.json.
يظهر في الكونسول running the pre-deploy command: prisma migrate deploy ثم pre-deploy command finished. وإذا فشل الأمر يتوقف النشر في مرحلة pre-deploy ولا يبدأ بوتك.
أمر تنفّذه من الكونسول
يشتغل أمر ما قبل النشر مع كل نشر، فأبقِ ترحيلات قاعدة البيانات فيه. أما المهمة التي تنفّذها بنفسك مرة واحدة، فاكتب أمرها في الكونسول، مثل:
npx prisma db seedلتعبئة قاعدة البيانات ببياناتها الأولى.node scripts/backfill.jsلتنفيذ أحد سكربتاتك مرة واحدة.npm ls discord.jsلمعرفة إصدار المكتبة المثبّت.
ننفّذ الأمر كما نشغّل بوتك: في مجلد الكود، وبالمستخدم نفسه الذي يشتغل به بوتك، ومعه متغيرات بوتك و node_modules/.bin في المسار. ويشتغل حتى لو كان بوتك متوقفًا أو متعطّلًا. ويظهر ما يطبعه في الكونسول، ثم السطر serverk: command finished، أو السطر serverk: command failed (exit 1)، والرقم فيه رمز خروج الأمر. ويعيد النشر التالي كل ملف يحمله الكود إلى حالته فيه، لذلك ضع أي تغيير دائم في كودك، مثل مكتبة جديدة.
ننفّذ أمرًا واحدًا في كل مرة، لمدة 10 دقائق على الأكثر، ويتوقف ما يطبعه عند 256 KiB. ولا يستقبل الأمر أي إدخال، فالأمر الذي يطرح سؤالًا ينتهي فورًا، لذلك أضف إليه خيار تجاوز الأسئلة، مثل --yes. وقبل أول نشر لبوتك، يظهر في الكونسول serverk: deploy the bot first.
TypeScript
- مع البناء:
"build": "tsc"و"start": "node dist/index.js". ويبقىtypescriptفيdevDependenciesكما هو، لأننا نثبّتها أيضًا. ولا تضفNODE_ENV=productionإلى المتغيرات، فمعه يتجاوز npm مكتباتdevDependenciesولا يجد البناءtsc. - دون بناء: إذا كان
index.tsفي أعلى الكود ولم نجد ملف تشغيل قبله، نشغّله بـnode index.ts، فيحذف Node الأنواع ويشغّل الملف. وإذا احتاج كودك إلى البناء قبل التشغيل، فأضف سكربتbuild. - مع
tsxفي مكتباتك، يشتغل أمرstartمثلtsx src/index.ts، لأنnode_modules/.binفي المسار.
كيف نشغّل بوتك
أول تطابق هو المعتمد:
- أمر التشغيل في إعدادات بوتك.
- الحقل
startفيserverk.json. - سطر
worker:أوbot:فيProcfile. - سكربت
startفيpackage.json. - الملف المذكور في
mainفيpackage.json، بـnode. index.jsثمsrc/index.jsثمbot.jsثمsrc/bot.jsثمindex.ts، بـnode.
نشغّل أمر سكربت start مباشرة، لا عبر npm start، فلا يشتغل سكربت prestart. ضع خطوته في build بدلًا منه، أو في أمر ما قبل النشر إذا كانت ترحيلات قاعدة البيانات.
إصدار Node
يشتغل بوتك على Node 24، وهو الإصدار الموجود في بيئة التشغيل. نقرأ engines.node و .nvmrc و .node-version و .tool-versions، وإذا طلبت إصدارًا آخر ننبّهك في «شغّل بوتك»، ونطبع في الكونسول سطرًا مثل the code asks for Node 18, this runtime is Node 24، ثم نشغّل بوتك على Node 24.
Bun وما في بيئة التشغيل
Bun موجود في بيئة التشغيل أيضًا: مع bun.lock نثبّت بـ bun install --frozen-lockfile، وأمر start مثل bun run src/index.ts يشغّل بوتك بـ Bun. وفيها كذلك python3 و make و g++ للمكتبات التي تُبنى عند التثبيت، و ffmpeg للصوت.
هل ساعدك هذا الشرح؟
ساهم في تحسين هذا الشرح
الشروحات مفتوحة المصدر، فإذا كان لديك تصحيح أو إضافة، افتح Pull Request على github.com/serverkgg/bot-node