إعادة استخدام مكتبات Android الخاصة باستخدام Sonatype Nexus Repository OSS

أعتقد أن الكثيرين كانوا بحاجة إلى إعادة استخدام الوحدات الفردية لتطبيق Android الخاص بهم في مشروع آخر. هناك طرق بسيطة لحل هذه المشكلة ، على سبيل المثال ، استضافة مكتبة Android بشكل عام باستخدام JitPack . الحل ممتاز ، ولكن إذا كنت بحاجة إلى وضع المكتبة بشكل خاص ، فسيتعين عليك الدفع ، وستعتمد التعريفة في الغالب على عدد القطع الأثرية الموضوعة. هذا الحل غير مناسب للجميع.

فيما يلي سأقدم حلاً بسيطًا لهذه المشكلة باستخدام Sonatype Nexus Repository OSS.


مقدمة


لا يقصد من المقالة أن تكون شاملة وتعكس فقط الحل الأساسي. ونتيجة لذلك ، ستقوم بتثبيت برنامج لإدارة القطع الأثرية على جانب المضيف ، ونص برمجي لنشر مكتبات Android ، والقدرة على تنفيذ التبعيات في تطبيقك من مستودع مخضرم محلي. ربما توجد بالفعل منشورات من هذا النوع حول حبري ، لكنني لم أجد برنامجًا تعليميًا مفهومًا لمطور Android ، مما دفعني إلى مشاركة المعلومات معك. سأكون سعيدًا إذا اتضح أنه مفيد حقًا في العمل.

الخطوة 1. التحضير


تحتاج أولاً إلى تحديد مكان تثبيت Nexus. من المنطقي إذا كان هذا خادمًا ، والذي ستتمكن دائمًا من الوصول إليه أثناء التطوير. في هذه المقالة ، سنقوم بتثبيت Nexus على نفس المضيف الذي نقوم بتطويره. الاختلافات عند التثبيت على الخادم ستكون فقط في عنوان IP الذي سنصل عنده إلى المستودعات.

قبل تثبيت Nexus ، تحتاج إلى تنزيل وتثبيت JRE. فقط Oracle JRE هو المناسب والإصدار 1.8 فقط (تم تجريبه 10 ، لكن Nexus أقسم) ، وهذا موضح بوضوح في الوثائق . تذكر أن تضيف المسار إلى ملفات JRE التنفيذية في المسار الخاص بك.

بعد ذلك ، تحتاج إلى تنزيل Nexus من الموقع الرسمي . في وقت كتابة هذا الإصدار 3.12

الخطوة 2. تثبيت Nexus وتكوينه


يكفي تفريغ الأرشيف الذي تم تنزيله في المكان المناسب لك. ثم يمكنك بدء البرنامج والبدء في العمل. للاستخدام على المدى الطويل والمريح ، تحتاج إلى تسجيل Nexus كخدمة وتشغيله عند بدء تشغيل نظام التشغيل. يتم وصف كيفية القيام بذلك بشكل واضح في الوثائق . في حالتنا ، ما عليك سوى الانتقال إلى nexus-3.12/bin/ " nexus-3.12/bin/ " وتشغيل ملف nexus من سطر الأوامر.

في حالة Windows c:

 nexus.exe /run 

في حالة يونكس:

 ./nexus run 

ونتيجة لذلك ، من المفترض أن ترى إشعارًا حول الإطلاق الناجح ، يبدو كالتالي:

صورة


حان الوقت لاختبار وظائف Nexus. للقيام بذلك ، ما عليك سوى الانتقال إلى الرابط http: // localhost: 8081 . كما تعلم ، في حالة الخادم ، بدلاً من " localhost " ، تحتاج إلى تحديد عنوان IP لخادمك ، ويستخدم Nexus المنفذ 8081 للعمل. سترى هذه الصفحة:

صورة


بادئ ذي Sign in ، تحتاج إلى تسجيل الدخول ، انقر فوق " Sign in " Sign in العلوي الأيمن وأدخل تسجيل الدخول ( admin ) وكلمة المرور ( admin123 ) للمسؤول. بعد ذلك ، يظهر رمز الترس ، عن طريق النقر على الذي ندخل في الإعدادات.

صورة


في شاشة الإعدادات ، سترى روابط إلى Blob Stores . Blob Stores هي مستودعات بيانات مستودعك. في إعدادات كل مستودع ، يمكنك تحديد Blob Store معين لتخزين المعلومات. واحد سيكون كافياً بالنسبة لنا ، تم إنشاؤه افتراضيًا. Repositories هي المستودعات التي تهمنا ، حيث سيتم تخزين المكتبات.

ولكن قبل الانتقال إلى وصف المستودعات ، يجدر ضبط الإعدادات الأساسية للمستخدمين. دعنا نذهب إلى قسم " Roles ".

صورة


بالإضافة إلى أدوار المشرف والمستخدم المجهول ، أقترح تخصيص أدوار من نوع "أداة Downloader " - لتحميل التبعيات في المشاريع ، " Contributor " - لإرسال المكتبات إلى Nexus.

انقر على "إنشاء دور" ، ثم حدد "دور Nexus" ، وأدخل بيانات "التنزيل" كما في لقطة الشاشة أدناه:

صورة


ما هي الامتيازات المسؤولة عن ما تم وصفه بالتفصيل في الوثائق . نحتاج إلى تحديد امتياز بعلامة " repository-view " (وهي مسؤولة عن العمل مع بيانات المستودعات) ، ويجب أن يمنح الامتياز أيضًا حق قراءة بيانات المستودع ، وهذا هو علامة " read " ، وبما أننا في Android نعمل مع مستودعات مخزنة ، فإن الأمر يستحق maven2 علامة " maven2 " لمنع المستخدم من العمل مع أنواع أخرى من المستودعات. انقر فوق " Create role ".

عن طريق القياس ، نقوم بإنشاء دور " Contributor ". والفرق الوحيد هو أننا سوف نرث القراءة مباشرة من دور " Downloader " (الإعداد في أسفل الصفحة) ، وسنمنح بأيدينا امتيازات للتعديل وإضافة العناصر إلى المستودع ، وكذلك لعرض بيانات المستودعات عبر واجهة الويب.

صورة


بعد ذلك ، قم بإنشاء المستخدمين الذين سنعين لهم الأدوار المكونة. نذهب إلى قسم " Users " (على الجانب الأيسر من النافذة) وننقر على " Create local user ". للتحقق ، يمكنك تعيين كلمات مرور مماثلة لكلمة مرور المسؤول القياسية ، وهي " downloader123 " و " contributor123 ". ملء عينة على الشاشة:

صورة


نظرًا لأن هدفنا هو العمل الخاص ، فإن الأمر يستحق تعطيل الوصول إلى بيانات المستودع للمستخدمين المجهولين. للقيام بذلك ، انتقل إلى المستخدم "غير anonimous " وقم بتغيير حالته من " Active " إلى " Disabled ". في هذه الحالة ، لن يكون من الممكن الحصول على تبعيات مجهولة الهوية في مشروع Android ، ولكن فقط مع مستخدم وكلمة مرور محددين ، ولكن سيظل من الممكن تنزيل البيانات عبر واجهة الويب.

من أجل منع المستخدمين المجهولين من عرض محتويات المستودعات عبر واجهة الويب ، انتقل إلى قسم " Anonimous " وقم بإلغاء تحديد الخيار " Allow anonymous users to access the server ". تذكر أن تحفظ التغييرات.

تبقى الخطوة الأخيرة - إنشاء مستودعات. انتقل إلى قسم " Repositories " Repositories المستودعات الافتراضية التي تم إنشاؤها هناك. من بينها هناك مستودعات " maven2 " ، إذا نظرت عن كثب ، يمكنك رؤية أنواع مختلفة: "proxy" ، "group" ، "host". عندما يقوم مستودع الوكيل بإعادة توجيه المستخدم ببساطة إلى مستودع آخر ، في حالة " maven-central " التي تم تكوينها مسبقًا ، يكون هذا رابطًا إلى https://repo1.maven.org/maven2/ ، قد تتضمن "مجموعة" عدة مستودعات ، و "مستضاف" هو بالفعل مستودع محدد مخزن في Nexus. ستكون مفيدة لنا الآن.

إنشاء مستودعات لإصدارات "الإصدار" و "لقطة" من القطع الأثرية. انقر على " Create repository " ، وحدد " maven2 (hosted) ". سوف نطلق على المستودع الأول "android" ونحفظه ببساطة دون تغيير الإعدادات:

صورة


نطلق على المستودع الثاني "android_snapshot" ، وقم بتغيير " Version policy " إلى "Spapshot" و " Deployment policy " إلى "السماح بإعادة Deployment policy ".

صورة


إذا لم يكن واضحًا ما يؤثر ذلك ، يمكنك القراءة هنا . في الواقع ، لن يتمكن مستودع "android" من تنزيل نفس الإصدار من المكتبة بشكل متكرر ، وهذا هو السلوك المعتاد عند التواصل ، على سبيل المثال ، مع مخضرم مركزي. بالنسبة إلى مستودع android_snapshot ، يجب أن ينتهي اسم الإصدار بالضرورة بـ SNAPSHOT ، وسيكون الإصدار نفسه متاحًا للتنزيل مرة أخرى.

انتبه أيضًا إلى حقيقة أن قائمة المستودعات تحتوي على عمود "URL" مع أزرار "نسخ" ، سنحتاج إلى هذه الروابط في المستقبل للوصول إلى المستودعات من المشاريع.

مبروك! تم الانتهاء من التكوين الأساسي لـ Nexus ، لقد حان الوقت لبدء إنشاء المكتبة ونشرها.

الخطوة 3. إنشاء ونشر مكتبة أندرويد


نقوم بإنشاء مشروع Android ، وسوف نسميه "TestLibrary". بعد ذلك ، في "عرض المشروع" ، انقر فوق جذر المشروع بزر الماوس الأيمن ، وحدد "جديد" و "وحدة". في النافذة التي تفتح ، حدد "مكتبة Android" وقم بتسمية المكتبة "HelloLibrary". نتيجة لذلك ، سترى وحدة مكتبتنا الجديدة بجوار وحدة "التطبيق".

صورة


أضف فئة مع وظيفة ترحيب إلى المكتبة:

 package com.example.nexus.hellolibrary fun helloFromOurLibrary() { println("### Hello World! This is our new Android library!") } 

المكتبة جاهزة ، حان وقت النشر. في "عرض المشروع" في الوحدة النمطية "hellolibrary" ، أضف الملف وأطلق عليه "publisher.gradle". ستقوم بتخزين البرنامج النصي لنشر المكتبة.

 //     apply plugin: 'maven-publish' ext { // URL  Release  repositoryReleaseUrl = "http://localhost:8081/repository/android/" // URL  Snapshot  repositorySnapshotUrl = "http://localhost:8081/repository/android_snapshot/" //  ,      contributorUserName = "contributor" //  ,      contributorPassword = "contributor123" //    libraryGroupId = "com.example.nexus" //   libraryArtifact = "hellolibrary" //   libraryVersion = "0.0.1" } //  publishing { //    repositories { //    maven { //     credentials { username contributorUserName password contributorPassword } //         Snapshot     url libraryVersion.endsWith("SNAPSHOT") ? repositorySnapshotUrl : repositoryReleaseUrl } } //     maven-publish  publications { // AndroidLibrary -   ,    //  ,     AndroidLibrary(MavenPublication) { //     groupId libraryGroupId artifactId libraryArtifact version libraryVersion //      artifact "$buildDir/outputs/aar/${project.getName()}-release.aar" pom { //         , //   ClassNotFoundException   // . withXml { def dependencies = asNode().appendNode("dependencies") configurations.getByName("releaseCompileClasspath") .getResolvedConfiguration() .getFirstLevelModuleDependencies() .each { def dependency = dependencies.appendNode("dependency") dependency.appendNode("groupId", it.moduleGroup) dependency.appendNode("artifactId", it.moduleName) dependency.appendNode("version", it.moduleVersion) } } // withXml } // pom } // AndroidLibrary } // publications //  assembleRelease   model { tasks.publishAndroidLibraryPublicationToMavenRepository { dependsOn project.tasks.assembleRelease } } } //publishing 

بعد ذلك ، انتقل إلى "build.gradle" من مكتبتنا ، وقم بتطبيق ناشرنا عليها وقم بمسحها من التبعيات غير الضرورية:
 apply plugin: 'com.android.library' apply plugin: 'kotlin-android' //  publisher apply from: "publisher.gradle" android { compileSdkVersion 28 defaultConfig { minSdkVersion 18 targetSdkVersion 28 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" } repositories { mavenCentral() } 

يمكننا الآن النشر فقط من خلال إكمال مهمة " publishAndroidLibraryPublicationToMavenRepository ".
صورة


تم نشر المكتبة ، مبروك! تحقق من النتيجة في واجهة الويب لجهاز Nexus. انتقل إلى عنصر "تصفح" وحدد مستودع "android". يجب أن ترى ما يلي:
صورة


الخطوة 4. استخدام التبعيات من Nexus


للاختبار ، أقترح إنشاء مشروع Android فارغ آخر.

للبدء ، قم بتوصيل المستودع بالمشروع بمجرد إضافة البيانات إلى ملف "build.gradle" على مستوى المشروع:

 buildscript { ext.kotlin_version = '1.2.50' repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.1.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } allprojects { repositories { google() jcenter() //    maven { credentials { username "downloader" password "downloader123" } url "http://localhost:8081/repository/android" } } } task clean(type: Delete) { delete rootProject.buildDir } 

والآن ، كما هو الحال مع أي مكتبة أخرى ، نحصل على اعتماد على "hellolibrary" من خلال التنفيذ في ملف "build.gradle" الخاص بمستوى "التطبيق".

 apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' android { compileSdkVersion 28 defaultConfig { applicationId "com.example.nexus.fff" minSdkVersion 18 targetSdkVersion 28 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'com.android.support:appcompat-v7:28.0.0-alpha3' implementation 'com.android.support.constraint:constraint-layout:1.1.2' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' //   implementation "com.example.nexus:hellolibrary:0.0.1" } 

الطريق إلى التبعية groupId:artifactId:version أنه groupId:artifactId:version .

يمكنك الآن استدعاء وظيفة helloFromOurLibrary() في مشروع Android واختبار أداء الدائرة بأكملها. مبروك!

الملخص


الآن لديك الفرصة لإعادة استخدام مكتبات Android الخاصة في المشاريع. في انتظار التعليقات!

آمل أنك لم تضيع وقتك ، شكرا لك!

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


All Articles