Wiederverwendung privater Android-Bibliotheken mit Sonatype Nexus Repository OSS

Ich denke, dass viele die Notwendigkeit hatten, einzelne Module ihrer Android-Anwendung in einem anderen Projekt wiederzuverwenden. Es gibt einfache Möglichkeiten, um dieses Problem zu lösen. Hosten Sie beispielsweise Ihre Android-Bibliothek öffentlich mit JitPack . Die Lösung ist ausgezeichnet, aber wenn Sie die Bibliothek privat platzieren müssen, müssen Sie bezahlen, und der Tarif hängt meistens von der Anzahl der platzierten Artefakte ab. Diese Lösung ist nicht für jeden geeignet.

Im Folgenden werde ich eine einfache Lösung für dieses Problem mit Sonatype Nexus Repository OSS anbieten.


Einführung


Der Artikel soll nicht umfassend sein und spiegelt nur eine grundlegende Lösung wider. Als Ergebnis haben Sie Software zum Verwalten von Artefakten auf der Seite eines Hosts installiert, ein Skript zum Veröffentlichen einer Android-Bibliothek und die Möglichkeit, Abhängigkeiten in Ihrer Anwendung aus dem lokalen Maven-Repository zu implementieren. Vielleicht gibt es bereits Veröffentlichungen dieser Art auf Habré, aber ich habe kein verständliches Tutorial für den Android-Entwickler gefunden, das mich dazu veranlasste, Informationen mit Ihnen zu teilen. Ich werde mich freuen, wenn sich herausstellt, dass es bei der Arbeit wirklich nützlich ist.

Schritt 1. Vorbereitung


Zuerst müssen Sie entscheiden, wo Nexus installiert werden soll. Es ist logisch, wenn dies ein Server ist, auf den Sie während der Entwicklung immer Zugriff haben. In diesem Artikel installieren wir Nexus auf demselben Host, auf dem wir entwickeln. Die Unterschiede bei der Installation auf dem Server bestehen nur in der IP-Adresse, unter der wir auf die Repositorys zugreifen.

Vor der Installation von Nexus müssen Sie JRE herunterladen und installieren. Nur Oracle JRE ist geeignet und nur Version 1.8 (versucht 10, aber Nexus schwor), dies ist in der Dokumentation deutlich angegeben . Denken Sie daran, den Pfad zu den ausführbaren JRE-Dateien in Ihrem PATH hinzuzufügen.

Als nächstes müssen Sie Nexus von der offiziellen Website herunterladen . Zum Zeitpunkt des Schreibens ist dies Version 3.12

Schritt 2. Installieren und konfigurieren Sie Nexus


Es reicht aus, das heruntergeladene Archiv dort zu entpacken, wo es für Sie bequem ist. Dann können Sie das Programm starten und mit der Arbeit beginnen. Für eine langfristige und bequeme Verwendung müssen Sie Nexus als Dienst registrieren und beim Start des Betriebssystems ausführen. Wie das geht, ist in der Dokumentation ganz klar beschrieben . In unserem Fall gehen Sie einfach in den nexus-3.12/bin/ " nexus-3.12/bin/ " und führen Sie die Nexus-Datei über die Befehlszeile aus.

Im Fall von c Windows:

 nexus.exe /run 

Im Fall von Unix:

 ./nexus run 

Infolgedessen sollte eine Benachrichtigung über einen erfolgreichen Start angezeigt werden. Sie sieht ungefähr so ​​aus:

Bild


Es ist an der Zeit, die Funktionalität des Nexus zu testen. Gehen Sie dazu einfach auf den Link http: // localhost: 8081 . Wie Sie verstehen, müssen Sie im Fall eines Servers anstelle von " localhost " die IP-Adresse Ihres Servers angeben, und Nexus verwendet Port 8081, um zu arbeiten. Diese Seite wird angezeigt:

Bild


Zunächst müssen Sie sich anmelden, oben rechts auf "Anmelden" klicken und den Login ( admin ) und das Passwort ( admin123 ) des Administrators admin123 . Danach erscheint das Zahnradsymbol, indem Sie darauf klicken, um in die Einstellungen zu gelangen.

Bild


Auf dem Einstellungsbildschirm sehen Sie Links zu Blob Stores und Repositories . Blob Stores sind die Repositorys für Ihre Repository-Daten. In den Einstellungen jedes Repositorys können Sie einen bestimmten Blob Store zum Speichern von Informationen angeben. Eine wird für uns ausreichen, standardmäßig erstellt. Repositories sind die für uns interessanten Repositories, in denen die Bibliotheken gespeichert werden.

Bevor Sie jedoch mit der Beschreibung der Repositorys fortfahren, sollten Sie grundlegende Einstellungen für Benutzer vornehmen. Gehen wir zum Abschnitt " Roles ".

Bild


Zusätzlich zu den Rollen des Administrators und des anonymen Benutzers schlage ich vor, Rollen vom Typ " Downloader " zuzuweisen - zum Laden von Abhängigkeiten in Projekte " Contributor " - zum Senden von Bibliotheken an Nexus.

Klicken Sie auf "Rolle erstellen", wählen Sie dann die "Nexus-Rolle" aus und geben Sie die Daten für den "Downloader" wie im folgenden Screenshot ein:

Bild


Welche Berechtigungen sind für das verantwortlich, was in der Dokumentation ausführlich beschrieben wird. Wir müssen ein Privileg mit dem Flag " repository-view " auswählen (es ist für die Arbeit mit den Daten der Repositorys verantwortlich). Das Privileg sollte auch das Recht zum Lesen der Repository-Daten einräumen. Dies ist das Flag " read ". Da wir in Android mit Maven-Repositorys arbeiten, lohnt es sich maven2 Flag " maven2 ", um zu verhindern, dass der Benutzer mit anderen Arten von Repositorys arbeitet. Klicken Sie auf " Create role ".

In Analogie erstellen wir die Rolle " Contributor ". Der einzige Unterschied besteht darin, dass wir das Lesen direkt von der Rolle " Downloader " (Einstellung am Ende der Seite) erben und mit unseren Händen Berechtigungen zum Bearbeiten, Hinzufügen von Artefakten zum Repository und zum Anzeigen der Daten der Repositorys über die Weboberfläche erteilen.

Bild


Erstellen Sie als Nächstes die Benutzer, denen wir die konfigurierten Rollen zuweisen. Wir gehen zum Abschnitt " Users " (auf der linken Seite des Fensters) und klicken auf " Create local user ". Zur Überprüfung können Sie Kennwörter festlegen, die dem Standard-Administratorkennwort ähnlich sind, dh " downloader123 " und " contributor123 ". Probenfüllung auf dem Bildschirm:

Bild


Da unser Ziel die private Arbeit ist, lohnt es sich, den Zugriff auf Repository-Daten für anonyme Benutzer zu deaktivieren. Gehen Sie dazu zum Benutzer " anonimous " und ändern Sie seinen Status von " Active " in " Disabled ". In diesem Fall ist es nicht möglich, Abhängigkeiten im Android-Projekt anonym abzurufen, sondern nur mit einem bestimmten Benutzer und Kennwort. Es ist jedoch weiterhin möglich, Daten über die Weboberfläche herunterzuladen.

Um zu verhindern, dass anonyme Benutzer den Inhalt der Repositorys über die Weboberfläche Anonimous , gehen Sie zum Abschnitt " Anonimous " und deaktivieren Allow anonymous users to access the server Option " Allow anonymous users to access the server ". Denken Sie daran, die Änderungen zu speichern.

Der letzte Schritt bleibt - das Einrichten von Repositorys. Gehen Sie zum Abschnitt " Repositories " und sehen Sie sich die dort erstellten Standard-Repositorys an. Unter ihnen gibt es Repositorys " maven2 ". Wenn Sie genau hinschauen, können Sie verschiedene Typen sehen: "Proxy", "Gruppe", "gehostet". Wenn das Proxy-Repository den Benutzer einfach an ein anderes Repository weiterleitet, ist dies im Fall des vorkonfigurierten " maven-central " ein Link zu https://repo1.maven.org/maven2/ . "Group" kann mehrere Repositorys enthalten. und "gehostet" ist bereits ein bestimmtes Repository, das in Nexus gespeichert ist. Sie werden uns jetzt nützlich sein.

Erstellen Sie Repositorys für die Versionen "Release" und "Snapshot" der Artefakte. Klicken Sie auf " Create repository " und wählen Sie " maven2 (hosted) ". Wir werden das erste Repository "android" nennen und es einfach speichern, ohne die Einstellungen zu ändern:

Bild


Wir nennen das zweite Repository "android_snapshot", ändern die " Version policy " in "Spapshot" und die " Deployment policy " in "Neu bereitstellen zulassen".

Bild


Wenn nicht klar ist, was dies betrifft, können Sie es hier lesen. Tatsächlich kann das "Android" -Repository nicht wiederholt dieselbe Version der Bibliothek herunterladen. Dies ist das übliche Verhalten, wenn Sie beispielsweise mit maven-central kommunizieren. Für das Repository android_snapshot muss der Versionsname unbedingt auf SNAPSHOT enden, und dieselbe Version steht wieder zum Download zur Verfügung.

Beachten Sie auch die Tatsache, dass die Liste der Repositorys eine "URL" -Spalte mit "Kopieren" -Schaltflächen enthält. Diese Links werden wir in Zukunft benötigen, um auf Repositorys aus Projekten zugreifen zu können.

Glückwunsch! Die Grundkonfiguration von Nexus ist abgeschlossen. Es ist Zeit, mit dem Erstellen und Veröffentlichen der Bibliothek zu beginnen.

Schritt 3. Erstellen und veröffentlichen Sie die Android-Bibliothek


Wir erstellen das Android-Projekt, wir werden es "TestLibrary" nennen. Klicken Sie anschließend in der „Projektansicht“ mit der rechten Maustaste auf das Projektstammverzeichnis und wählen Sie „Neu“ und „Modul“. Wählen Sie im folgenden Fenster "Android-Bibliothek" aus und nennen Sie die Bibliothek "HelloLibrary". Als Ergebnis sehen Sie das Modul unserer neuen Bibliothek neben dem Modul „App“.

Bild


Fügen Sie der Bibliothek eine Klasse mit einer Willkommensfunktion hinzu:

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

Die Bibliothek ist fertig, es ist Zeit zu veröffentlichen. Fügen Sie in der "Projektansicht" im Modul "hellolibrary" die Datei hinzu und nennen Sie sie "publisher.gradle". Das Skript zum Veröffentlichen der Bibliothek wird gespeichert.

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

Gehen Sie als Nächstes zum "build.gradle" unserer Bibliothek, wenden Sie unseren Herausgeber darauf an und entfernen Sie unnötige Abhängigkeiten:
 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() } 

Jetzt können wir veröffentlichen, indem wir die Aufgabe " publishAndroidLibraryPublicationToMavenRepository " publishAndroidLibraryPublicationToMavenRepository .
Bild


Die Bibliothek ist veröffentlicht, herzlichen Glückwunsch! Überprüfen Sie das Ergebnis in der Weboberfläche unseres Nexus. Gehen Sie zum Element "Durchsuchen" und wählen Sie das Repository "Android" aus. Sie sollten Folgendes sehen:
Bild


Schritt 4. Verwenden von Abhängigkeiten von Nexus


Für den Test schlage ich vor, ein weiteres leeres Android-Projekt zu erstellen.

Verbinden Sie zunächst das Repository mit dem Projekt, indem Sie einfach Daten zur Datei "build.gradle" auf Projektebene hinzufügen:

 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 } 

Und jetzt, wie bei jeder anderen Bibliothek, erhalten wir durch die Implementierung in der Datei "build.gradle" der Ebene "app" eine Abhängigkeit von unserer "hellolibrary".

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

Der Pfad zur Abhängigkeit wird als groupId:artifactId:version .

Jetzt können Sie die Funktion helloFromOurLibrary() in Ihrem Android-Projekt aufrufen und die Leistung der gesamten Schaltung testen. Glückwunsch!

Zusammenfassung


Jetzt haben Sie die Möglichkeit, private Android-Bibliotheken in Projekten wiederzuverwenden. Warten auf Kommentare!

Ich hoffe du hast deine Zeit nicht verschwendet, danke!

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


All Articles