- الرئيسية
- Documentation
- الأصلية
- دليل تشغيل البناء والإصدار وتصحيح الأخطاء للمكونات الأصيلة
دليل تشغيل البناء والإصدار وتصحيح الأخطاء للمكونات الأصيلة
يصف هذا الدليل كيفية إنتاج خط أنابيب البناء الخاص بـ @f5-sales-demo/pi-natives لإضافات .node، وكيفية تحميل التوزيعات المُجمَّعة لها، وكيفية تصحيح أخطاء المُحمِّل/فشل البناء.
يتبع هذا الدليل مصطلحات البنية المعمارية من docs/natives-architecture.md:
- إنتاج القطع الأثرية في وقت البناء (
scripts/build-native.ts) - توليد بيان الإضافة المضمّنة (
scripts/embed-native.ts) - تحميل الإضافة في وقت التشغيل + بوابة التحقق (
src/native.ts)
ملفات التنفيذ
Section titled “ملفات التنفيذ”packages/natives/scripts/build-native.tspackages/natives/scripts/embed-native.tspackages/natives/package.jsonpackages/natives/src/native.tscrates/pi-natives/Cargo.toml
نظرة عامة على خط أنابيب البناء
Section titled “نظرة عامة على خط أنابيب البناء”1) نقاط دخول البناء
Section titled “1) نقاط دخول البناء”سكريبتات packages/natives/package.json:
bun scripts/build-native.ts(build) → بناء إصدار الإنتاجbun scripts/build-native.ts --dev(dev:native) → بناء ملف التصحيح/التطوير (نفس تسمية المخرجات)bun scripts/embed-native.ts(embed:native) → توليدsrc/embedded-addon.tsمن الملفات المبنية
2) بناء القطعة الأثرية بلغة Rust
Section titled “2) بناء القطعة الأثرية بلغة Rust”يشغّل build-native.ts أداة Cargo في crates/pi-natives:
- الأمر الأساسي:
cargo build - يضيف وضع الإصدار
--releaseما لم يُمرَّر--dev - يضيف الهدف العابر للمنصات
--target <CROSS_TARGET>
يُعلن crates/pi-natives/Cargo.toml عن crate-type = ["cdylib"]، لذا تُصدر أداة Cargo مكتبة مشتركة (.so/.dylib/.dll) يتم نسخها/إعادة تسميتها لاحقاً إلى اسم ملف إضافة .node.
3) اكتشاف القطعة الأثرية وتثبيتها
Section titled “3) اكتشاف القطعة الأثرية وتثبيتها”بعد اكتمال Cargo، يفحص build-native.ts أدلة المخرجات المرشّحة بالترتيب:
${CARGO_TARGET_DIR}(إن كان مُعيَّناً)<repo>/targetcrates/pi-natives/target
لكل جذر يتحقق من أدلة الملفات الشخصية:
- البناء العابر للمنصات:
<root>/<crossTarget>/<profile>ثم<root>/<profile> - البناء الأصيل:
<root>/<profile>
ثم يبحث عن أحد الملفات:
libpi_natives.solibpi_natives.dylibpi_natives.dlllibpi_natives.dll
عند الاكتشاف، يُثبِّت الملف بصورة ذرية في packages/natives/native/ باستخدام دلالات الملف المؤقت + إعادة التسمية (يعالج احتياط Windows صراحةً حالات فشل استبدال DLL المقفولة).
نموذج الهدف/المتغير واصطلاحات التسمية
Section titled “نموذج الهدف/المتغير واصطلاحات التسمية”وسم المنصة
Section titled “وسم المنصة”يستخدم كل من البناء ووقت التشغيل وسم المنصة:
<platform>-<arch> (مثال: darwin-arm64، linux-x64)
نموذج المتغير (x64 فقط)
Section titled “نموذج المتغير (x64 فقط)”يدعم x64 متغيرات المعالج:
modern(مسار قادر على AVX2)baseline(احتياطي)
تستخدم المنصات غير x64 قطعة أثرية افتراضية واحدة (بدون لاحقة متغير).
أسماء ملفات المخرجات
Section titled “أسماء ملفات المخرجات”بناءات الإصدار:
- x64:
pi_natives.<platform>-<arch>-modern.nodeأو...-baseline.node - غير x64:
pi_natives.<platform>-<arch>.node
بناء التطوير (--dev):
- يستخدم علامات ملف التصحيح لكنه يحتفظ بتسمية المخرجات القياسية ذات الوسم الخاص بالمنصة
ترتيب مرشّحات المُحمِّل في native.ts:
- مرشّحات الإصدار
- يُقدِّم وضع التجميع المرشّحات المستخرجة/المخزنة مؤقتاً قبل الملفات المحلية للحزمة
علامات البيئة وخيارات البناء
Section titled “علامات البيئة وخيارات البناء”علامات وقت التشغيل
Section titled “علامات وقت التشغيل”PI_DEV(سلوك المُحمِّل): تمكين تشخيصات المُحمِّلPI_NATIVE_VARIANT(سلوك المُحمِّل، x64 فقط): فرض اختيارmodernأوbaselineفي وقت التشغيلPI_COMPILED(سلوك المُحمِّل): تمكين سلوك مرشّح/استخراج الثنائيات المُجمَّعة
علامات/خيارات وقت البناء
Section titled “علامات/خيارات وقت البناء”--dev(معامل السكريبت): بناء ملف التصحيحCROSS_TARGET: يُمرَّر إلى Cargo--targetTARGET_PLATFORM: تجاوز تسمية وسم منصة المخرجاتTARGET_ARCH: تجاوز تسمية بنية المخرجاتTARGET_VARIANT(x64 فقط): فرضmodernأوbaselineلاسم ملف المخرجات وسياسة RUSTFLAGSCARGO_TARGET_DIR: جذر إضافي عند البحث في مخرجات CargoRUSTFLAGS:- إذا لم تكن مُعيَّنة وليس هناك تجميع عابر للمنصات، يضبط السكريبت:
- modern:
-C target-cpu=x86-64-v3 - baseline:
-C target-cpu=x86-64-v2 - غير x64 / بدون متغير:
-C target-cpu=native
- modern:
- إذا كانت مُعيَّنة مسبقاً، لا يتجاوزها السكريبت
- إذا لم تكن مُعيَّنة وليس هناك تجميع عابر للمنصات، يضبط السكريبت:
حالات البناء/انتقالات دورة الحياة
Section titled “حالات البناء/انتقالات دورة الحياة”دورة حياة البناء (build-native.ts)
Section titled “دورة حياة البناء (build-native.ts)”- التهيئة: تحليل المعامِلات/البيئة (
--dev، تجاوزات الهدف، علامات التجميع العابر) - تحديد المتغير:
- غير x64 → لا متغير
- x64 +
TARGET_VARIANT→ متغير صريح - بناء x64 عابر للمنصات بدون
TARGET_VARIANT→ خطأ فادح - بناء x64 محلي بدون تجاوز → اكتشاف AVX2 للمضيف
- التجميع: تشغيل Cargo مع الملف الشخصي/الهدف المحدَّدين
- تحديد موقع القطعة الأثرية: فحص جذور الهدف/أدلة الملف الشخصي/أسماء المكتبات
- التثبيت: النسخ + إعادة التسمية الذرية في
packages/natives/native - الاكتمال: الإضافة جاهزة لمرشّحات المُحمِّل
تحدث حالات الخروج بالفشل في أي مرحلة مع نص خطأ صريح (متغير غير صالح، فشل بناء cargo، مكتبة الإخراج مفقودة، فشل التثبيت/إعادة التسمية).
دورة حياة التضمين (embed-native.ts)
Section titled “دورة حياة التضمين (embed-native.ts)”- التهيئة: حساب وسم المنصة من
TARGET_PLATFORM/TARGET_ARCHأو قيم المضيف - مجموعة المرشّحات:
- يتوقع x64 كلاً من
modernوbaseline - يتوقع غير x64 ملفاً افتراضياً واحداً
- يتوقع x64 كلاً من
- التحقق من التوفر في
packages/natives/native - توليد البيان (
src/embedded-addon.ts) مع استيراداتfileلـ Bun وإصدار الحزمة - جاهزية استخراج وقت التشغيل لوضع التجميع
يتجاوز --reset التحقق ويكتب بذرة بيان فارغة (embeddedAddon = null).
سير عمل التطوير مقابل السلوك المشحون/المُجمَّع
Section titled “سير عمل التطوير مقابل السلوك المشحون/المُجمَّع”سير عمل التطوير المحلي
Section titled “سير عمل التطوير المحلي”الحلقة المحلية النموذجية:
- بناء الإضافة:
- إصدار الإنتاج:
bun --cwd=packages/natives run build - ملف التصحيح:
bun --cwd=packages/natives run dev:native
- إصدار الإنتاج:
- تعيين
PI_DEV=1عند اختبار تشخيصات المُحمِّل - يحلّ المُحمِّل في
native.tsالمرشّحات المحلية للحزمةnative/(واحتياط دليل الملف التنفيذي) - يفرض
validateNativeتوافق الصادرات قبل استخدام الأغلفة للربط
سير عمل الثنائي المشحون/المُجمَّع
Section titled “سير عمل الثنائي المشحون/المُجمَّع”في وضع التجميع (PI_COMPILED أو علامات Bun المضمّنة):
- يحسب المُحمِّل دليل ذاكرة التخزين المؤقت ذا الإصدار:
<getNativesDir()>/<packageVersion>(تشغيلياً~/.xcsh/natives/<version>) - إذا تطابق البيان المضمَّن مع المنصة+الإصدار الحاليَّين، قد يستخرج المُحمِّل الملف المضمَّن المحدَّد في ذلك الدليل ذي الإصدار
- يتضمن ترتيب مرشّحات وقت التشغيل:
- دليل ذاكرة التخزين المؤقت ذو الإصدار
- دليل الثنائي المُجمَّع القديم (
%LOCALAPPDATA%/xcshعلى Windows،~/.local/binفي غيره) - أدلة الحزمة/الملف التنفيذي
- لا تزال أول إضافة تُحمَّل بنجاح يجب أن تجتاز
validateNative
هذا هو السبب في ضرورة توافق توقعات التعبئة + مُحمِّل وقت التشغيل: يجب أن تتطابق أسماء الملفات ووسوم المنصات والرموز المُصدَّرة مع ما يفحصه native.ts ويتحقق منه.
تعيين JS API ↔ صادرات Rust (مجموعة فرعية من بوابة التحقق)
Section titled “تعيين JS API ↔ صادرات Rust (مجموعة فرعية من بوابة التحقق)”يتطلب native.ts وجود هذه الصادرات المرئية من JS على الإضافة المحمَّلة. تُعيَّن إلى صادرات N-API في Rust ضمن crates/pi-natives/src:
اسم JS المطلوب بواسطة validateNative | إعلان صادر Rust | ملف مصدر Rust |
|---|---|---|
glob | #[napi] pub fn glob(...) | crates/pi-natives/src/glob.rs |
grep | #[napi] pub fn grep(...) | crates/pi-natives/src/grep.rs |
search | #[napi] pub fn search(...) | crates/pi-natives/src/grep.rs |
highlightCode | #[napi] pub fn highlight_code(...) | crates/pi-natives/src/highlight.rs |
getSystemInfo | #[napi] pub fn get_system_info(...) | crates/pi-natives/src/system_info.rs |
getWorkProfile | #[napi] pub fn get_work_profile(...) (صادر بصيغة camelCase) | crates/pi-natives/src/prof.rs |
invalidateFsScanCache | #[napi] pub fn invalidate_fs_scan_cache(...) | crates/pi-natives/src/fs_cache.rs |
إذا كان أي رمز مطلوب مفقوداً، يفشل المُحمِّل بسرعة مع تلميح بإعادة البناء.
سلوك الفشل والتشخيصات
Section titled “سلوك الفشل والتشخيصات”أعطال وقت البناء
Section titled “أعطال وقت البناء”- تكوين متغير غير صالح:
TARGET_VARIANTمُعيَّن على غير x64 → خطأ فوري- بناء x64 عابر للمنصات بدون
TARGET_VARIANTصريح → خطأ فوري
- فشل بناء Cargo:
- يعرض السكريبت الخروج غير الصفري ومخرجات stderr
- القطعة الأثرية غير موجودة:
- يطبع السكريبت كل دليل ملف شخصي تم التحقق منه
- فشل التثبيت:
- رسالة صريحة؛ يتضمن Windows تلميحاً بالملف المقفول
أعطال مُحمِّل وقت التشغيل (native.ts)
Section titled “أعطال مُحمِّل وقت التشغيل (native.ts)”- وسم منصة غير مدعومة:
- يطرح استثناءً مع قائمة المنصات المدعومة
- لا يمكن تحميل أي مرشّح:
- يطرح استثناءً مع قائمة أخطاء المرشّحات الكاملة وتلميحات المعالجة الخاصة بالوضع
- صادرات مفقودة:
- يطرح استثناءً مع أسماء الرموز المفقودة بالضبط وأمر إعادة البناء
- مشاكل استخراج التضمين:
- يتم تسجيل أخطاء mkdir/write الخاصة بالاستخراج وتضمينها في التشخيصات النهائية
مصفوفة استكشاف الأخطاء وإصلاحها
Section titled “مصفوفة استكشاف الأخطاء وإصلاحها”| العَرَض | السبب المحتمل | التحقق | الإصلاح |
|---|---|---|---|
Native addon missing exports ... Missing: <name> | ثنائي .node قديم، عدم تطابق اسم صادر Rust، أو تحميل ثنائي خاطئ | التشغيل مع PI_DEV=1 لرؤية المسار المحمَّل؛ فحص قائمة الصادرات لذلك الملف | إعادة البناء build؛ التأكد من تطابق اسم صادر Rust #[napi] (أو الاسم المستعار الصريح عند الحاجة) مع مفتاح JS؛ حذف الملفات المخزنة/ذات الإصدار القديمة |
| جهاز x64 يحمّل baseline عندما يُتوقع modern | PI_NATIVE_VARIANT=baseline، عدم اكتشاف AVX2، أو وجود ملف baseline فقط | التحقق من PI_NATIVE_VARIANT؛ فحص native/ للملف -modern | بناء متغير modern (TARGET_VARIANT=modern ... build) والتأكد من شحن الملف |
| البناء العابر للمنصات ينتج ثنائياً غير قابل للاستخدام/مُوسَماً بشكل خاطئ | عدم تطابق بين CROSS_TARGET وTARGET_PLATFORM/TARGET_ARCH، أو غياب TARGET_VARIANT لـ x64 | تأكيد مجموعة env واسم ملف المخرجات | إعادة التشغيل بقيم env متسقة وTARGET_VARIANT صريح لـ x64 |
| فشل الثنائي المُجمَّع بعد الترقية | ذاكرة تخزين مؤقت مستخرجة قديمة (~/.xcsh/natives/<old-or-mismatched-version>) أو عدم تطابق البيان المضمَّن | فحص دليل natives ذي الإصدار وقائمة أخطاء المُحمِّل | حذف ذاكرة التخزين المؤقت لـ natives ذات الإصدار الخاص بإصدار الحزمة وإعادة التشغيل؛ إعادة توليد البيان المضمَّن أثناء التعبئة |
| يفحص المُحمِّل مسارات كثيرة ولا يجد أياً منها | عدم تطابق المنصة أو غياب القطعة الأثرية للإصدار في native/ الخاص بالحزمة | التحقق من platformTag مقابل اسم/أسماء الملف الفعلية | التأكد من أن اسم الملف المبني يتطابق تماماً مع اصطلاح pi_natives.<platform>-<arch>(-variant).node وأن الحزمة تتضمن native/ |
يفشل embed:native بـ “Incomplete native addons” | ملفات المتغير المطلوبة لم تُبنَ قبل التضمين | التحقق من قائمة المتوقع مقابل الموجود في نص الخطأ | بناء الملفات المطلوبة أولاً (x64: كلاً من modern+baseline؛ غير x64: الافتراضي)، ثم إعادة تشغيل embed:native |
أوامر التشغيل
Section titled “أوامر التشغيل”# قطعة أثرية للإصدار للمضيف الحاليbun --cwd=packages/natives run build
# بناء قطعة أثرية لملف التصحيحbun --cwd=packages/natives run dev:native
# بناء متغيرات x64 الصريحةTARGET_VARIANT=modern bun --cwd=packages/natives run buildTARGET_VARIANT=baseline bun --cwd=packages/natives run build
# توليد بيان الإضافة المضمّنة من الملفات الأصيلة المبنيةbun --cwd=packages/natives run embed:native
# إعادة تعيين البيان المضمَّن إلى بذرة فارغةbun --cwd=packages/natives run embed:native -- --reset