
على مدى السنوات القليلة الماضية ، نجح مفهوم
المستودعات الأحادية في ترسيخ نفسه بنجاح ، حيث يمكن أن يسهل بشكل كبير عملية تطوير مشاريع البرامج المعيارية ، مثل البنى التحتية القائمة على الخدمات المصغرة. المزايا الرئيسية لهذا النهج المعماري واضحة في الممارسة العملية ، لذلك ، أقترح إنشاء
مستودع أحادي للاختبار الخاص بك من البداية ، وفهم الفروق الدقيقة للعمل مع
مساحات عمل الغزل وليرنا في نفس الوقت . حسنًا ، لنبدأ!
النظر في هيكل مشروعنا ، والتي ستكون ثلاث مكتبات تقع في
الحزم / المجلد ، وكذلك
package.json في الدليل الجذر.
├── package.json └── packages ├── app │ ├── index.js │ └── package.json ├── first │ ├── index.js │ └── package.json └── second ├── index.js └── package.json
من المفهوم أن لدينا مكتبتان مستقلتان
الأولى والثانية ، بالإضافة إلى مكتبة
تطبيقات ستقوم باستيراد وظائف من أول اثنين. للراحة ، يتم وضع جميع الحزم الثلاث في دليل
الحزم . يمكنك تركهم في المجلد الجذر أو وضعهم في دليل بأي اسم آخر ، ولكن من أجل اتباع الاتفاقيات المقبولة عمومًا ، سنضعها على هذا النحو.
ستحتوي المكتبات
الأولى والثانية على بساطة التجربة على وظيفة واحدة فقط في
index.js ، ستُرجع كل منها سلسلة hello نيابة عن الوحدة النمطية. في المثال
الأول ، سيبدو كما يلي:
في وحدة
التطبيق ، سوف نعرض رسالة
Hi من التطبيق في وحدة التحكم ، وكذلك تحيات من مجموعتين أخريين:
بحيث يتوفر
الأول والثاني في
التطبيق ، ونشير إليهما على أنهما تبعيات في
التبعيات .
بالإضافة إلى ذلك ، نضيف بادئة
@ monorepo لكل اسم مكتبة في
اسم القيمة أمام الاسم الرئيسي للحزمة إلى
package.json المحلي.
لماذا أحتاج إلى بادئة برمز كلب أمام اسم الحزمة npm (@ monorepo /)؟تعد إضافة بادئة أمرًا اختياريًا ، ولكن هذا
هو بالضبط
نوع اصطلاح تسمية الحزمة الذي تلتزم به العديد من المستودعات الاحتكارية:
babel ،
المواد واجهة المستخدم ،
الزاوي وغيرها. الحقيقة هي أن لكل مستخدم أو مؤسسة
نطاقها الخاص على موقع
npm ، لذلك هناك ضمان بأن يتم إنشاء جميع الوحدات النمطية التي تحتوي على
@ somescope / postfix بواسطة فريق
somescope ، وليس من قِبل المهاجمين. علاوة على ذلك ، يصبح من الممكن استدعاء أسماء الوحدات النمطية التي تم أخذها بالفعل. على سبيل المثال ، لا يمكنك فقط أخذ وإنشاء وحدة
الأدوات الخاصة بك ، لأن هذه المكتبة
موجودة بالفعل . ومع ذلك ، بإضافة postfix
@ myscopename / يمكننا الحصول على أدواتنا (
@ myscopename / utils ) مع البلاك جاك والسيدات الشابات.
يمكن أن يكون التماثلية من واقع الحياة لمشروع الاختبار لدينا مكتبات متعددة للعمل مع البيانات ، وأدوات التحقق من الصحة ، والتحليلات ، أو مجرد مجموعة من مكونات واجهة المستخدم. إذا افترضنا أننا سنطور تطبيق
ويب وتطبيقات
جوال (على سبيل المثال ، باستخدام
React و
React Native ، على التوالي) ، ولدينا جزء من المنطق المعاد استخدامه ، فقد يكون من المفيد وضعه في مكونات منفصلة ، لاستخدامه لاحقًا في مشاريع أخرى. أضف إلى هذا الخادم على
Node.js وستحصل على حالة حقيقية للغاية من الحياة.
مساحات عمل الغزل
سيكون اللمسة الأخيرة قبل إنشاء
مستودع أحادي كامل التصميم من
package.json في جذر مستودعنا. انتبه إلى خاصية
مساحات العمل - لقد حددنا قيمة
الحزم / * ، مما يعني "كافة المفاتيح الفرعية في مجلد
الحزم ". في حالتنا ، هذا هو
التطبيق ،
الأول والثاني .
بالإضافة إلى ذلك ،
"خاص": يجب تحديد
true في
package.json ، نظرًا لأن
مساحات العمل متوفرة فقط في المشروعات الخاصة.
من أجل خلع كل شيء ، قم بتنفيذ أمر
الغزل (مماثل
لتثبيت الغزل أو
تثبيت npm ) من الدليل الجذر. نظرًا لأن التبعيات الموجودة في وحدة
التطبيق يتم تعريفها على أنها
مساحات عمل في
الحزمة الجذر.
json ، في الواقع ، لن نقوم بتنزيل أي شيء من
npm-registry ، ولكن ببساطة ربط ("link") الحزم الخاصة بنا.
yarn

الآن يمكننا تنفيذ الأمر
العقدة. من الدليل الجذر الذي سيقوم بتشغيل البرنامج النصي من ملف
الحزم / app / index.js .
node .

دعونا نرى كيف يعمل.
عن طريق استدعاء
الغزل ، أنشأنا روابط رمزية في
node_modules لأدلةنا في مجلد
الحزم .

نظرًا لهذه العلاقة في التبعيات ، حصلنا على ميزة واحدة كبيرة - الآن ، عند التغيير في النموذجين
الأول والثاني ، سيتلقى تطبيقنا الإصدار الحالي من هذه الحزم دون إعادة البناء. في الممارسة العملية ، أنها مريحة للغاية ، لأنه يمكننا إجراء تطوير محلي للحزم ، ولا يزال تعريفها على أنها تبعيات تابعة لجهات خارجية (والتي أصبحت في النهاية).
الميزة المهمة التالية التي يمكنك الحصول عليها من العمل مع
مساحات عمل الغزل هي تنظيم تخزين تبعيات الطرف الثالث.
تعرف على المزيد حول تخزين التبعيات في المستوى الأعلى.لنفترض أننا أردنا استخدام مكتبة
lodash في
الأولى والثانية .
من خلال تنفيذ الأمر yarn add lodash من الأدلة المناسبة ، سوف نتلقى تحديثًا إلى
الحزمة المحلية.
json - سوف يظهر الإصدار الحالي من الحزمة في
تبعيات .
"dependencies": { "lodash": "^4.17.11" }
بالنسبة لحزمة
lodash نفسها - فعليًا ، سيتم تثبيت المكتبة في
node_modules على مستوى الجذر مرة واحدة.
إذا كان الإصدار المطلوب من الحزمة الخارجية (في حالتنا
lodash ) مختلفًا عن
الأول والثاني (على سبيل المثال ،
فأنت بحاجة إلى
lodash v3.0.0 ،
والثاني الإصدار 4.0.0 ) ، ثم
ستصل الحزمة ذات الإصدار الأقل (
3.0.0 ) إلى الجذر
node_modules ، وسيتم
تخزين إصدار
lodash للوحدة
الثانية في
الحزم المحلية
/ second / node_modules .
بالإضافة إلى المزايا ، قد يكون لهذا النهج عيوب بسيطة ، والتي يسمح
الغزل بتجاوزها بمساعدة أعلام إضافية. يمكنك قراءة المزيد حول هذه الفروق الدقيقة في
الوثائق الرسمية .
أضف ليرنا
الخطوة الأولى في العمل مع
lerna هي تثبيت الحزمة. عادةً ما يقومون بإجراء تثبيت عام (
yarn global add lerna أو
npm i -g lerna ) ، ولكن إذا لم تكن متأكدًا مما إذا كنت تريد استخدام هذه المكتبة ، يمكنك استخدام المكالمة باستخدام
npx .
سنقوم بتهيئة
lerna من الدليل الجذر:
lerna init

في الواقع ، لقد قمنا بالعديد من الإجراءات في وقت واحد بمساعدة أمر واحد: أنشأنا مستودعًا git (إذا لم تتم تهيئته قبل ذلك) ، أنشأنا ملف
lerna.json وقمنا بتحديث
الحزمة root.json الخاصة بنا.
الآن في ملف
lerna.json المنشأ حديثًا
، أضف سطرين -
"npmClient": "yarn" و
"useWorkspaces": true . يشير السطر الأخير إلى أننا نستخدم بالفعل
مساحات عمل الغزل وليس هناك حاجة لإنشاء
مجلد التطبيق / node_modules بروابط رمزية إلى
الأول والثاني .
اختبارات مع ليرنا
لإظهار راحة العمل مع
lerna أضف اختبارات
لمكتباتنا .
من الدليل الجذر ، نقوم بتثبيت الحزمة للاختبار -
jest . قم بتشغيل الأمر:
yarn add -DW jest
لماذا أحتاج إلى العلم -WW؟هناك حاجة إلى علامة -D (- dev) بحيث يتم تثبيت حزمة jest تبعية dev ، وتتيح علامة -W (- ignore-workspace-root-check) التثبيت على مستوى الجذر (الذي نحتاجه).
الخطوة التالية هي إضافة ملف اختبار واحد إلى الحزمة الخاصة بنا. لراحة مثالنا ، سنجعل جميع الاختبارات متشابهة. في المثال
الأول ، سيبدو ملف الاختبار كما يلي:
نحتاج أيضًا إلى إضافة برنامج نصي لتشغيل الاختبارات في
package.json لكل مكتبة من مكتباتنا:
اللمسة النهائية سيتم تحديث
الحزمة الجذر.
json . أضف برنامجًا نصيًا
للاختبار سوف يستدعي
اختبار تشغيل lerna - تيار . تحدد المعلمة التالية
لتشغيل lerna الأمر الذي سيتم استدعاؤه في كل حزمة من الحزم الخاصة بنا من
الحزم / المجلد ، وستسمح لنا العلامة
--stream بمشاهدة نتائج النتائج في الجهاز الطرفي.
نتيجة لذلك ، تبدو
package.json من الدليل الجذر كما يلي:
الآن ، لإجراء الاختبارات ، نحتاج فقط إلى تشغيل الأمر من جذر مشروعنا:
yarn test

ترقية الإصدار مع Lerna
ستكون المهمة الشائعة التالية ، والتي يمكن
ليرنا التعامل معها بالجودة ، تحديث إصدارات الحزمة. تخيل أنه بعد تنفيذ الاختبارات ، قررنا ترقية مكتباتنا من 1.0.0 إلى 2.0.0. للقيام بذلك ، ما عليك سوى إضافة السطر
"update: version": "نسخة lerna - no-push" إلى حقل
البرامج النصية في
الحزمة الجذر.
json ، ثم قم بتشغيل
تحديث الغزل: الإصدار من الدليل الجذر. تتم إضافة علامة
- no-push بحيث لا يتم إرسال التغييرات بعد تحديث الإصدار إلى المستودع البعيد ، وهو ما تقوم به
lerna افتراضيًا (بدون هذه العلامة).
نتيجة لذلك ، ستبدو
الحزمة الجذر الخاصة بنا.
قم بتشغيل البرنامج النصي لتحديث الإصدار:
yarn update:version
بعد ذلك ، سيُطلب منا تحديد الإصدار الذي نريد التبديل إليه:

بالنقر فوق
Enter ، نحصل على قائمة الحزم التي يتم فيها تحديث الإصدار.

نؤكد التحديث بإدخال
y ونصلك رسالة حول التحديث الناجح.

إذا حاولنا تشغيل أمر
git status ،
فلنحصل على
شيء نرسله إلى الرسالة
، ونعمل الشجرة النظيفة ، لأن لا يقوم
lerna version بتحديث إصدارات الحزمة فحسب ، بل يقوم أيضًا بإنشاء التزام وعلامة
بالإشارة إلى الإصدار الجديد (الإصدار 2.0 في حالتنا).
ميزات العمل مع فريق نسخة ليرناإذا قمت بإضافة السلسلة
"version": "نسخة lerna - no-push" بدلاً من
"update: version": "نسخة lerna - no-push" في حقل
البرامج النصية في
الحزمة الجذر.
json ، فمن المحتمل أن تصادف سلوكًا غير متوقع و وحدة التحكم الحمراء. الحقيقة هي أن
البرامج النصية npm بشكل افتراضي تستدعي الأمر
version (البرنامج النصي المحجوز) مباشرة بعد تحديث إصدار الحزمة ، مما يؤدي إلى استدعاء متكرر
لإصدار lerna . لتجنب هذا الموقف ، يكفي إعطاء البرنامج النصي اسمًا مختلفًا ، على سبيل المثال
التحديث: الإصدار ، كما حدث في مثالنا.
استنتاج
تُظهر هذه الأمثلة مائة من جميع الاحتمالات التي لدى
ليرنا مع
مساحات عمل الغزل . لسوء الحظ ، لم أجد حتى الآن تعليمات مفصلة للعمل مع المستودعات الإحيائية باللغة الروسية ، لذلك يمكننا افتراض أن البداية قد تحققت!
رابط إلى مستودع مشروع الاختبار.