Menggunakan kembali Perpustakaan Android Pribadi dengan Sonatype Nexus Repository OSS

Saya pikir banyak yang perlu menggunakan kembali modul individual dari aplikasi Android mereka di proyek lain. Ada cara sederhana untuk mengatasi masalah ini, misalnya, menghosting perpustakaan Android Anda secara publik menggunakan JitPack . Solusinya sangat baik, tetapi jika Anda perlu menempatkan perpustakaan secara pribadi, Anda harus membayar, dan tarif akan paling sering tergantung pada jumlah artefak yang ditempatkan. Solusi ini tidak cocok untuk semua orang.

Di bawah ini saya akan menawarkan solusi sederhana untuk masalah ini menggunakan Sonatype Nexus Repository OSS.


Pendahuluan


Artikel ini tidak dimaksudkan untuk bersifat komprehensif dan hanya mencerminkan solusi dasar. Sebagai hasilnya, Anda akan menginstal perangkat lunak untuk mengelola artefak di sisi host, skrip untuk menerbitkan pustaka Android, kemampuan untuk mengimplementasikan dependensi dalam aplikasi Anda dari repositori maven lokal. Mungkin sudah ada publikasi semacam ini tentang Habré, tetapi saya tidak menemukan tutorial yang dapat dimengerti untuk pengembang Android, yang mendorong saya untuk berbagi informasi dengan Anda. Saya akan senang jika ternyata benar-benar bermanfaat dalam pekerjaan.

Langkah 1. Persiapan


Pertama, Anda perlu memutuskan di mana akan menginstal Nexus. Adalah logis jika ini adalah server, yang Anda akan selalu memiliki akses selama pengembangan. Pada artikel ini, kami akan menginstal Nexus pada host yang sama yang sedang kami kembangkan. Perbedaan saat memasang di server hanya akan di alamat ip di mana kita akan mengakses repositori.

Sebelum menginstal Nexus, Anda harus mengunduh dan menginstal JRE. Hanya Oracle JRE yang cocok dan hanya versi 1.8 (mencoba 10, tetapi Nexus bersumpah), ini jelas ditunjukkan dalam dokumentasi . Ingatlah untuk menambahkan path ke executable JRE di PATH Anda.

Selanjutnya Anda perlu mengunduh Nexus dari situs resmi . Pada saat penulisan, ini adalah versi 3.12

Langkah 2. Instal dan konfigurasikan Nexus


Cukup membongkar arsip yang telah diunduh di tempat yang nyaman bagi Anda. Kemudian Anda dapat memulai program dan mulai bekerja. Untuk penggunaan jangka panjang dan nyaman, Anda harus mendaftarkan Nexus sebagai layanan dan menjalankannya saat OS dimulai. Cara melakukan ini dijelaskan dengan sangat jelas dalam dokumentasi . Dalam kasus kami, buka saja nexus-3.12/bin/ " nexus-3.12/bin/ " dan jalankan file nexus dari baris perintah.

Dalam kasus c Windows:

 nexus.exe /run 

Dalam kasus Unix:

 ./nexus run 

Akibatnya, Anda akan melihat pemberitahuan tentang peluncuran yang sukses, tampilannya seperti ini:

Gambar


Waktunya telah tiba untuk menguji fungsionalitas Nexus. Untuk melakukan ini, cukup buka tautan http: // localhost: 8081 . Seperti yang Anda pahami, dalam hal server, alih-alih " localhost ", Anda perlu menentukan alamat ip server Anda, dan Nexus menggunakan port 8081 untuk bekerja. Anda akan melihat halaman ini:

Gambar


Pertama-tama, Anda harus masuk, klik " Sign in " Sign in kanan atas dan masukkan login ( admin ) dan kata sandi ( admin123 ) dari administrator. Setelah itu, ikon roda gigi muncul, dengan mengklik di mana kita masuk ke pengaturan.

Gambar


Pada layar pengaturan, Anda akan melihat tautan ke Blob Stores dan Repositories . Blob Stores adalah repositori untuk data repositori Anda. Dalam pengaturan masing-masing repositori, Anda dapat menentukan Blob Store tertentu untuk menyimpan informasi. Satu akan cukup bagi kita, dibuat secara default. Repositories adalah repositori yang menarik bagi kami, di mana perpustakaan akan disimpan.

Tetapi sebelum beralih ke deskripsi repositori, ada baiknya membuat pengaturan dasar untuk pengguna. Mari kita pergi ke bagian " Roles ".

Gambar


Selain peran administrator dan pengguna anonim, saya sarankan mengalokasikan peran tipe " Downloader " - untuk memuat dependensi ke dalam proyek, " Contributor " - untuk mengirim perpustakaan ke Nexus.

Klik "Buat peran", lalu pilih "Peran Nexus", masukkan data untuk "Pengunduh" seperti pada tangkapan layar di bawah ini:

Gambar


Hak istimewa apa yang bertanggung jawab atas apa yang dijelaskan secara terperinci dalam dokumentasi . Kita perlu memilih hak istimewa dengan bendera " repository-view " (bertanggung jawab untuk bekerja dengan data repositori), hak istimewa juga harus memberikan hak untuk membaca data repositori, ini adalah bendera " read ", dan karena di Android kami bekerja dengan repositori maven, layak tinggal di bendera " maven2 " untuk mencegah pengguna bekerja dengan jenis repositori lainnya. Klik " Create role ".

Dengan analogi, kita menciptakan peran " Contributor ". Satu-satunya perbedaan adalah bahwa kami akan mewarisi bacaan langsung dari peran " Downloader " (pengaturan di bagian bawah halaman), dan dengan tangan kami, kami akan memberikan hak istimewa untuk mengedit, menambahkan artefak ke repositori, dan juga untuk melihat data repositori melalui antarmuka web.

Gambar


Selanjutnya, buat pengguna yang akan kami berikan peran terkonfigurasi. Kami pergi ke bagian " Users " (di sebelah kiri jendela) dan klik " Create local user ". Untuk verifikasi, Anda dapat menetapkan kata sandi yang mirip dengan kata sandi admin standar, yaitu, " downloader123 " dan " contributor123 ". Isi sampel di layar:

Gambar


Karena tujuan kami adalah pekerjaan pribadi, ada baiknya menonaktifkan akses ke data repositori untuk pengguna anonim, untuk ini kami pergi ke pengguna " anonimous " dan mengubah statusnya dari " Active " menjadi " Disabled ". Dalam hal ini, tidak mungkin mendapatkan dependensi secara anonim dalam proyek Android, tetapi hanya dengan pengguna dan kata sandi tertentu, tetapi masih mungkin untuk mengunduh data melalui antarmuka web.

Untuk melarang pengguna anonim melihat konten dari repositori melalui antarmuka web, buka bagian " Anonimous " dan hapus centang pada opsi " Allow anonymous users to access the server ". Ingatlah untuk menyimpan perubahan.

Langkah terakhir tetap - mengatur repositori. Pergi ke bagian " Repositories " dan lihat repositori default yang dibuat di sana. Di antara mereka ada repositori " maven2 ", jika Anda melihat lebih dekat, Anda dapat melihat berbagai jenis: "proxy", "grup", "host". Ketika repositori proksi hanya meneruskan pengguna ke repositori lain, dalam kasus " maven-central " yang telah dikonfigurasikan sebelumnya, ini adalah tautan ke https://repo1.maven.org/maven2/ , "grup" dapat mencakup beberapa repositori, dan "dihosting" sudah merupakan repositori spesifik yang disimpan di Nexus. Mereka akan berguna bagi kita sekarang.

Buat repositori untuk versi “Rilis” dan “Potret” artefak. Klik " Create repository ", pilih " maven2 (hosted) ". Kami akan memanggil repositori pertama "android" dan hanya menyimpannya tanpa mengubah pengaturan:

Gambar


Kami menyebut repositori kedua "android_snapshot", ubah " Version policy " menjadi "Spapshot" dan " Deployment policy " menjadi "Izinkan pengalihan pekerjaan".

Gambar


Jika tidak jelas apa pengaruhnya, Anda dapat membacanya di sini . Bahkan, repositori "android" tidak akan dapat mengunduh versi perpustakaan yang sama berulang kali, ini adalah perilaku yang biasa ketika berkomunikasi, misalnya, dengan pakar-pusat. Untuk repositori android_snapshot, nama versi harus diakhiri dengan SNAPSHOT dan versi yang sama akan tersedia untuk diunduh lagi.

Juga perhatikan fakta bahwa daftar repositori memiliki kolom "URL" dengan tombol "Salin", kita akan memerlukan tautan ini di masa depan untuk mengakses repositori dari proyek.

Selamat! Konfigurasi dasar Nexus selesai, saatnya untuk mulai membuat dan menerbitkan perpustakaan.

Langkah 3. Buat dan publikasikan perpustakaan Android


Kami membuat proyek Android, kami akan menamainya "TestLibrary". Selanjutnya, di "Project View", klik pada root proyek dengan tombol kanan mouse, pilih "New" dan "Module". Di jendela yang terbuka, pilih "Perpustakaan Android" dan beri nama perpustakaan "HelloLibrary". Hasilnya, Anda akan melihat modul perpustakaan baru kami di sebelah modul "aplikasi".

Gambar


Tambahkan kelas dengan fungsi sambutan ke perpustakaan:

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

Perpustakaan sudah siap, saatnya untuk menerbitkan. Dalam "Project view" di modul "hellolibrary" tambahkan file dan sebut "publisher.gradle". Ini akan menyimpan skrip untuk menerbitkan perpustakaan.

 //     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 

Selanjutnya, buka "build.gradle" dari perpustakaan kami, terapkan penerbit kami untuk itu dan bersihkan dari dependensi yang tidak perlu:
 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() } 

Sekarang kita dapat menerbitkan hanya dengan menyelesaikan tugas " publishAndroidLibraryPublicationToMavenRepository ".
Gambar


Perpustakaan diterbitkan, selamat! Periksa hasilnya di antarmuka web Nexus kami. Buka item "Browse" dan pilih repositori "android". Anda harus melihat yang berikut ini:
Gambar


Langkah 4. Menggunakan dependensi dari Nexus


Untuk pengujian, saya mengusulkan untuk membuat proyek Android kosong lainnya.

Untuk memulai, hubungkan repositori ke proyek dengan hanya menambahkan data ke file “build.gradle” di tingkat proyek:

 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 } 

Dan sekarang, seperti perpustakaan lainnya, kami mendapatkan ketergantungan pada "hellolibrary" kami melalui implementasi dalam file "build.gradle" pada level "app".

 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" } 

Jalan menuju ketergantungan groupId:artifactId:version sebagai groupId:artifactId:version .

Sekarang Anda dapat memanggil fungsi helloFromOurLibrary() di proyek Android Anda dan menguji kinerja seluruh rangkaian. Selamat!

Ringkasan


Sekarang Anda memiliki kesempatan untuk menggunakan kembali perpustakaan Android pribadi dalam proyek. Menunggu komentar!

Saya harap Anda tidak menyia-nyiakan waktu Anda, terima kasih!

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


All Articles