أعتقد أن الكثيرين كانوا بحاجة إلى إعادة استخدام الوحدات الفردية لتطبيق 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 الخاصة في المشاريع. في انتظار التعليقات!
آمل أنك لم تضيع وقتك ، شكرا لك!