تجربة استخدام flatten-maven-plugin لتبسيط الإصدار في مشاريع maven

عنا


في 1C ، نقوم بتطوير ليس فقط 1C: Enterprise platform في C ++ و JavaScript ، ولكن أيضًا تطبيقات Java - على وجه الخصوص ، بيئة تطوير Enterprise Development Tools الجديدة القائمة على Eclipse وخادم متكامل بعمق مع نظام messenger - Interaction Systems .

دخول


في أغلب الأحيان ، نستخدم maven كنظام لتجميع تطبيقات Java ، وفي هذه المقالة القصيرة نود التحدث عن إحدى المشكلات التي تعين علينا معالجتها أثناء عملية التطوير والنهج الذي سمح لنا بالتغلب على هذه المشكلة.

الخلفية وسير العمل


نظرًا لخصائص التنمية في مشاريعنا المافن ، فإننا نستخدم الكثير من الوحدات التبعية والمشاريع التابعة. يمكن أن يكون عدد ملفات بوم في شجرة واحدة عشرات أو حتى مئات.

صورة

يبدو: لا بأس ، بمجرد إنشائها ونسيانها. إذا كنت بحاجة إلى تغيير أو إضافة شيء ما في جميع الملفات مرة واحدة ، فهناك العديد من الأدوات المناسبة في المحررين و IDEs. وما هو التغيير المنتظم الأكثر شيوعًا إلى pom.xml؟ نعتقد أن تغيير إصدارات المشروع والتبعيات. ربما شخص ما يريد أن يجادل مع هذا ، ولكن هذا هو الحال معنا. والسبب هو أننا ، إلى جانب النواة ، نقوم بتطوير العديد من مكتباتنا في وقت واحد ، ولإمكانية التكرار المستمر لنتائج التجميع والاختبار ، فإن استخدام اللقطات لا يبدو لنا طريقة مناسبة. لهذا السبب ، من الضروري رفع رقم الإصدار في المشاريع في كل مجموعة.

أيضًا ، هناك حاجة من المطور من وقت لآخر إلى جمع فرعه من المكتبة والتحقق من أدائها مقابل كل التبعيات ، التي يتعين عليها جميعًا تغيير الإصدار يدويًا.

القرار الأولي


مع مثل هذه التغييرات المتكررة والمتعددة في الإصدار ، فإن العملية داخل CI تريد أن تكون مبسطة وآلية. هنا يأتي المكوّن الإضافي المألوف والمريح من المكوّن الإضافي المساعد في عملية الإنقاذ - نقوم بتوصيله وتشغيله

إصدارات mvn -N: set -DnewVersion = 2.0.1

سيفعل Maven كل شيء كما يجب: تشغيل التسلسل الهرمي من أعلى إلى أسفل ، واستبدال جميع الإصدارات - الجمال! الآن يبقى رفع طلب السحب ، وسيراقب الزملاء التغييرات ، ويمكنك الانضمام بسرعة إلى الجذع. بسرعة؟ لا يهم كيف. بضع مئات من pom.xml لكل مراجعة ، وهذا لا يحسب الكود. بالإضافة إلى ذلك ، لا يوجد أحد في مأمن من تعارضات الدمج مع هذا العدد الكبير من الملفات المعدلة. تجدر الإشارة هنا إلى أنه أثناء عملية CI ، تحدث تغييرات الإصدار تلقائيًا مع تغيير في الوظيفة ، وليس بشكل منفصل.

ميزات جديدة


لفترة من الوقت ، هدأنا وعاشنا في سلام ، إلى أن تم دعم اللاعبين من مشروع Maven Apache في maven ، بدءًا من الإصدار 3.5.0-beta-1 ، لدعم ما يسمى "العناصر النائبة" للإصدارات (العناصر النائبة). جوهر هذه البدائل هو أن المتغيرات $ {revision} و $ {sha1} و $ {changelist} تستخدم في pom.xml بدلاً من تحديد إصدار المشروع. يتم تعيين قيم هذه الخصائص نفسها إما في عنصر < الخصائص > ، أو يمكن تعريفها من خلال خاصية النظام

mvn -Risionision = 2.0.0 حزمة نظيفة

لقيم خصائص النظام الأسبقية على القيم المحددة في < الخصائص >.

الوالد
<المشروع>
<modelVersion> 4.0.0 </modelVersion>
<الأم>
<groupId> org.apache </groupId>
<artifactId> apache </artifactId>
<version> 18 </version>
</ الأصل>
<groupId> org.apache.maven.ci </groupId>
<artifactId> ci-parent </artifactId>
<name> First CI Friendly </name>
<version> $ {revision} $ {sha1} $ {changelist} </version>
...
<خصائص>
<revision> 1.3.1 </revision>
< changelist > -SNAPSHOT </ changelist >
<sha1 />
</ خصائص>
</ مشروع>

السليل
<المشروع>
<modelVersion> 4.0.0 </modelVersion>
<الأم>
<groupId> org.apache.maven.ci </groupId>
<artifactId> ci-parent </artifactId>
<version> $ {revision} $ {sha1} $ {changelist} </version>
</ الأصل>
<groupId> org.apache.maven.ci </groupId>
<artifactId> ci-child </artifactId>
...
</ مشروع>


إذا كنت ترغب في إنشاء الإصدار 2.0.0-SNAPSHOT ، ثم استخدم فقط

mvn -Risionision = 2.0.0 حزمة نظيفة

إذا كنت ترغب في عمل إصدار ، فما عليك سوى الخروج من SNAPSHOT

mvn -Dchangelist = حزمة نظيفة

* الأمثلة المذكورة أعلاه مأخوذة من مقال على موقع مشروع Maven Apache

حقيقة قاسية


كل شيء جيد وصحي ، لقد حان الوقت لتجربة الشعور بالرضا ، ولكن لا. اتضح أنه بالنسبة للتثبيت والنشر ، لن تنجح هذه الطريقة ، لأن $ {revision} لن يتم استبداله بقيمته في أوصاف القطع الأثرية المنشورة في المستودع ولن تفهم المافن ما يدور حوله.

<الأم>
<groupId> org.apache </groupId>
<artifactId> apache </artifactId>
<version> $ {revision} </version>
</ الأصل>


ضوء في نهاية النفق


يجب أن نبحث عن حل للمشكلة. كان من الممكن إنقاذ الوضع من خلال البرنامج المساعد flatten-maven-plugin . يسمح هذا المكون الإضافي بجميع المتغيرات في pom ، ولكنه في الوقت نفسه يستخرج طنًا من المعلومات الأخرى المطلوبة فقط أثناء التجميع وليس مطلوبًا عند استيراد القطع الأثرية المنشورة إلى مشاريع أخرى. وأيضًا ، يقوم المكون الإضافي "بتعديل" جميع التبعيات بين الوالدين والطفل ، ونتيجة لذلك نحصل على مسطح ، والذي يتضمن كل ما تحتاجه. كان الإزعاج هو أنه يقطع "الكثير" أكثر من اللازم ، وهو ما لم يناسبنا على الإطلاق. بعد دراسة المعلومات حول تطوير هذا المكون الإضافي ، اتضح أننا لسنا الوحيدين في الكون ، وعاد في أغسطس 2018 تم إنشاء طلب سحب على github في مستودع البرنامج المساعد مع الرغبة في إتاحة تحديد كيفية "التلف" pom.xml بشكل مستقل. استمع المطورون إلى أصوات المتأثرين ، وبالفعل في شهر ديسمبر ، مع إصدار الإصدار الجديد 1.1.0 ، ظهر وضع جديدCiFriendliesOnly في البرنامج المساعد flatten-maven-plugin ، وهو ما لم يحدث من قبل - فهو يترك pom.xml كما هو ، باستثناء عنصر <version> ويسمح بـ $ {مراجعة} ، $ {sha1} و $ {changelist} .

إضافة مكون إضافي للمشروع

<الإضافات>
<المساعد>
<groupId> org.codehaus.mojo </groupId>
<artifactId> flatten-maven-plugin </artifactId>
<version> 1.1.0 </version>
<التكوين>
<updatePomFile> true </updatePomFile>
<flattenMode> solutionCiFriendliesOnly </flattenMode>
</ تكوين>
<الإعدام>
<تنفيذ>
<id> تتسطح </id>
<المرحلة> موارد العملية </ المرحلة>
<الأهداف>
<goal> تتسطح </ goal>
</ الأهداف>
</ إعدام>
<تنفيذ>
<id> flatten.clean </id>
<المرحلة> نظيفة </ المرحلة>
<الأهداف>
<goal> clean </goal>
</ الأهداف>
</ إعدام>
</ الاعدام>
</ المساعد>
</ الإضافات>


القيام به!

نهاية سعيدة


من الآن فصاعدًا ، لتغيير إصدار المشروع بأكمله وإعلام جميع التبعيات به ، نحتاج فقط إلى تحرير عنصر < المراجعة > في الجذر pom.xml واحد فقط. ليس هناك مائة أو اثنين من هذه الملفات مع نفس التغيير الذي ينتقل إلى المراجعة ، لكنه ملف واحد. حسنًا ، ليست هناك حاجة لاستخدام إصدارات-maven-plugin .

Source: https://habr.com/ru/post/ar449172/


All Articles