Je pense que beaucoup avaient besoin de réutiliser des modules individuels de leur application Android dans un autre projet. Il existe des moyens simples de résoudre ce problème, par exemple, héberger publiquement votre bibliothèque Android à l'aide de JitPack . La solution est excellente, mais si vous devez placer la bibliothèque en privé, vous devrez payer et le tarif dépendra le plus souvent du nombre d'artefacts placés. Cette solution ne convient pas à tout le monde.
Ci-dessous, je proposerai une solution simple à ce problème en utilisant Sonatype Nexus Repository OSS.Présentation
L'article n'est pas destiné à être complet et ne reflète qu'une solution de base. En conséquence, vous aurez installé un logiciel pour gérer les artefacts du côté d'un hôte, un script pour publier une bibliothèque Android, la possibilité d'implémenter des dépendances dans votre application à partir du référentiel maven local. Il existe peut-être déjà des publications de ce type sur Habré, mais je n'ai pas trouvé de tutoriel compréhensible pour le développeur Android, ce qui m'a incité à partager des informations avec vous. Je serai heureux si cela s'avère vraiment utile dans le travail.
Étape 1. Préparation
Vous devez d'abord décider où installer Nexus. Il est logique qu'il s'agisse d'un serveur auquel vous aurez toujours accès pendant le développement. Dans cet article, nous allons installer Nexus sur le même hôte sur lequel nous développons. Les différences lors de l'installation sur le serveur ne concerneront que l'adresse IP à laquelle nous accéderons aux référentiels.
Avant d'installer Nexus, vous devez
télécharger et installer JRE. Seul Oracle JRE est adapté et seule la version 1.8 (essayé 10, mais Nexus a juré), cela est
clairement indiqué dans la documentation . N'oubliez pas d'ajouter le chemin d'accès aux exécutables JRE dans votre PATH.
Vous devez ensuite
télécharger Nexus sur le site officiel . Au moment de la rédaction, il s'agit de la version 3.12
Étape 2. Installez et configurez Nexus
Il suffit de décompresser l'archive téléchargée où cela vous convient. Ensuite, vous pouvez démarrer le programme et commencer à travailler. Pour une utilisation à long terme et pratique, vous devez enregistrer Nexus en tant que service et l'exécuter au démarrage du système d'exploitation. La procédure à suivre est assez clairement
décrite dans la documentation . Dans notre cas, accédez simplement au
nexus-3.12/bin/
"
nexus-3.12/bin/
" et exécutez le fichier nexus à partir de la ligne de commande.
Dans le cas de c Windows:
nexus.exe /run
Dans le cas d'Unix:
./nexus run
Par conséquent, vous devriez voir une notification concernant un lancement réussi, cela ressemble à ceci:
Le moment est venu de tester les fonctionnalités du Nexus. Pour ce faire, accédez simplement au lien
http: // localhost: 8081 . Comme vous le comprenez, dans le cas d'un serveur, au lieu de "
localhost
", vous devez spécifier l'adresse IP de votre serveur, et Nexus utilise le port 8081 pour fonctionner. Vous verrez cette page:
Tout d'abord, vous devez vous connecter, cliquez sur "
Sign in
"
Sign in
haut à droite et entrez le login (
admin
) et le mot de passe (
admin123
) de l'administrateur. Après cela, l'icône d'engrenage apparaît, en cliquant sur lequel nous entrons dans les paramètres.
Sur l'écran des paramètres, vous verrez des liens vers les
Blob Stores
et les
Repositories
.
Blob Stores
sont les référentiels de vos données de référentiel. Dans les paramètres de chaque référentiel, vous pouvez spécifier un
Blob Store
spécifique pour le stockage des informations. Un nous suffira, créé par défaut.
Repositories
sont les référentiels qui nous intéressent, dans lesquels les bibliothèques seront stockées.
Mais avant de passer à la description des référentiels, il convient de définir des paramètres de base pour les utilisateurs. Passons à la section "
Roles
".
En plus des rôles d'administrateur et d'utilisateur anonyme, je propose d'allouer des rôles de type "
Downloader
" - pour charger les dépendances dans les projets, "
Contributor
" - pour envoyer des bibliothèques à Nexus.
Cliquez sur "Créer un rôle", puis sélectionnez le "rôle Nexus", entrez les données du "Downloader" comme dans la capture d'écran ci-dessous:
Quels privilèges sont responsables de ce qui est décrit
en détail
dans la documentation . Nous devons sélectionner un privilège avec le drapeau "
repository-view
" (il est responsable de travailler avec les données des référentiels), le privilège devrait également donner le droit de lire les données du référentiel, c'est le drapeau "
read
", et comme dans Android nous travaillons avec les référentiels maven, cela vaut la peine s'attarder sur le drapeau "
maven2
" pour empêcher l'utilisateur de travailler avec d'autres types de référentiels. Cliquez sur "
Create role
".
Par analogie, nous créons le rôle "
Contributor
". La seule différence est que nous hériterons de la lecture directement du rôle "
Downloader
" (paramètre en bas de la page), et avec nos mains nous donnerons des privilèges pour éditer, ajouter des artefacts au référentiel, et aussi pour visualiser les données des référentiels via l'interface web.
Ensuite, créez les utilisateurs auxquels nous assignerons les rôles configurés. Nous allons dans la section "
Users
" (sur le côté gauche de la fenêtre) et cliquez sur "
Create local user
". Pour vérification, vous pouvez définir des mots de passe similaires au mot de passe administrateur standard, c'est-à-dire "
downloader123
" et "
contributor123
". Exemple de remplissage à l'écran:
Étant donné que notre objectif est le travail privé, il convient de désactiver l'accès aux données du référentiel pour les utilisateurs anonymes. Pour ce faire, accédez à l'utilisateur "
anonimous
" et changez son statut de "
Active
" en "
Disabled
". Dans ce cas, il ne sera pas possible d'obtenir de manière anonyme des dépendances dans le projet Android, mais uniquement avec un utilisateur et un mot de passe spécifiques, mais il sera toujours possible de télécharger des données via l'interface Web.
Afin d'interdire aux utilisateurs anonymes d'afficher le contenu des référentiels via l'interface Web, accédez à la section "
Anonimous
" et décochez l'option "
Allow anonymous users to access the server
". N'oubliez pas d'enregistrer les modifications.
La dernière étape reste la mise en place de référentiels. Allez dans la section "
Repositories
" et voyez les référentiels par défaut qui y sont créés. Parmi eux, il existe des référentiels "
maven2
", si vous regardez attentivement, vous pouvez voir différents types: "proxy", "groupe", "hébergé". Lorsque le référentiel proxy transfère simplement l'utilisateur vers un autre référentiel, dans le cas du "
maven-central
" préconfiguré, il s'agit d'un lien vers
https://repo1.maven.org/maven2/ , "groupe" peut inclure plusieurs référentiels, et «hébergé» est déjà un référentiel spécifique stocké dans Nexus. Ils nous seront utiles maintenant.
Créez des référentiels pour les versions «Release» et «Snapshot» des artefacts. Cliquez sur "
Create repository
", sélectionnez "
maven2 (hosted)
". Nous appellerons le premier dépôt «android» et l'enregistrerons simplement sans modifier les paramètres:
Nous appelons le deuxième référentiel «android_snapshot», changeons la «
Version policy
» en «Spapshot» et la «
Deployment policy
» en «Autoriser le redéploiement».
S'il n'est pas clair ce que cela affecte, vous pouvez le lire
ici . En fait, le référentiel «android» ne pourra pas télécharger la même version de la bibliothèque à plusieurs reprises, c'est le comportement habituel lors de la communication, par exemple, avec maven-central. Pour le référentiel android_snapshot, le nom de la version doit nécessairement se terminer par INSTANTANÉ et la même version sera à nouveau disponible pour téléchargement.
Faites également attention au fait que la liste des référentiels comporte une colonne "URL" avec des boutons "Copier", nous aurons besoin de ces liens à l'avenir pour accéder aux référentiels à partir des projets.
Félicitations! La configuration de base de Nexus est terminée, il est temps de commencer à créer et à publier la bibliothèque.
Étape 3. Créez et publiez une bibliothèque Android
Nous créons le projet Android, nous l'appellerons "TestLibrary". Ensuite, dans la «Vue du projet», cliquez sur la racine du projet avec le bouton droit de la souris, sélectionnez «Nouveau» et «Module». Dans la fenêtre qui s'ouvre, sélectionnez «Bibliothèque Android» et nommez la bibliothèque «HelloLibrary». En conséquence, vous verrez le module de notre nouvelle bibliothèque à côté du module «app».
Ajoutez une classe avec une fonction de bienvenue à la bibliothèque:
package com.example.nexus.hellolibrary fun helloFromOurLibrary() { println("### Hello World! This is our new Android library!") }
La bibliothèque est prête, il est temps de publier. Dans la "Vue du projet" du module "hellolibrary", ajoutez le fichier et appelez-le "publisher.gradle". Il stockera le script pour la publication de la bibliothèque.
// 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
Ensuite, accédez au "build.gradle" de notre bibliothèque, appliquez-y notre éditeur et supprimez-le des dépendances inutiles:
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() }
Maintenant, nous pouvons publier simplement en effectuant la tâche "
publishAndroidLibraryPublicationToMavenRepository
".
La bibliothèque est publiée, félicitations! Vérifiez le résultat dans l'interface Web de notre Nexus. Accédez à l'élément «Parcourir» et sélectionnez le référentiel «android». Vous devriez voir ce qui suit:
Étape 4. Utilisation des dépendances de Nexus
Pour le test, je propose de créer un autre projet Android vide.
Pour commencer, connectez le référentiel au projet en ajoutant simplement des données au fichier «build.gradle» du niveau projet:
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 }
Et maintenant, comme avec n'importe quelle autre bibliothèque, nous obtenons une dépendance de notre «bibliothèque hellénique» grâce à l'implémentation dans le fichier «build.gradle» du niveau «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" }
Le chemin d'accès à la dépendance est
groupId:artifactId:version
sous la forme
groupId:artifactId:version
.
Vous pouvez maintenant appeler la fonction
helloFromOurLibrary()
dans votre projet Android et tester les performances de l'ensemble du circuit. Félicitations!
Résumé
Vous avez maintenant la possibilité de réutiliser des bibliothèques Android privées dans des projets. En attente de commentaires!
J'espère que vous n'avez pas perdu votre temps, merci!