通过Sonatype Nexus Repository OSS重用私有Android库

我认为许多人都需要在另一个项目中重用其Android应用程序的各个模块。 解决此问题的方法很简单,例如,使用JitPack公开托管您的Android库。 该解决方案非常好,但是如果您需要将磁带库私下放置,则必须付费,而且关税通常取决于所放置物品的数量。 此解决方案并不适合所有人。

下面,我将使用Sonatype Nexus Repository OSS提供针对此问题的简单解决方案。


引言


本文并非旨在全面,仅反映了基本解决方案。 结果,您将在主机上安装了用于管理工件的软件,用于发布Android库的脚本,能够从本地maven存储库中实现应用程序中的依赖项的功能。 也许在Habré上已经有这类出版物,但是我没有找到Android开发人员可以理解的教程,这促使我与您共享信息。 如果它对工作真的有用,我将感到高兴。

步骤1.准备


首先,您需要确定Nexus的安装位置。 如果这是一台服务器是合乎逻辑的,那么在开发过程中您将始终可以访问该服务器。 在本文中,我们将Nexus安装在我们正在开发的同一主机上。 在服务器上安装时的区别仅在于我们将访问存储库的IP地址中。

在安装Nexus之前,您需要下载并安装JRE。 仅Oracle JRE适用,仅1.8版(尝试10,但Nexus宣誓效忠), 在文档中明确指出了这一点。 切记在PATH中将路径添加到JRE可执行文件。

接下来,您需要从官方网站下载Nexus 。 在撰写本文时,这是版本3.12

第2步:安装和配置Nexus


可以在方便的地方解压缩下载的存档文件。 然后,您可以启动程序并开始工作。 为了长期方便地使用,您需要将Nexus注册为服务并在操作系统启动时运行它。 文档中非常清楚地描述了如何执行此操作。 在我们的情况下,只需转到“ nexus-3.12/bin/nexus-3.12/bin/然后从命令行运行nexus文件。

对于c Windows:

 nexus.exe /run 

对于Unix:

 ./nexus run 

因此,您应该看到有关成功启动的通知,看起来像这样:

图片


现在该测试Nexus的功能了。 为此,只需转到链接http:// localhost:8081 。 如您所知,对于服务器而言,您需要指定服务器的IP地址,而不是“ localhost ”,并且Nexus使用端口8081起作用。您将看到以下页面:

图片


首先,您需要登录,单击右上角的“ Sign inSign in然后输入admin的登录名( admin )和密码( admin123 )。 之后,通过点击齿轮图标,我们进入设置。

图片


在设置屏幕上,您会看到指向Blob StoresRepositories链接。 Blob Stores是存储库数据的存储库。 在每个存储库的设置中,您可以指定一个特定的Blob Store来存储信息。 默认情况下,一个就足够了。 Repositories是我们感兴趣的存储库,这些库将存储在其中。

但是,在继续介绍存储库之前,有必要为用户进行基本设置。 让我们转到“ Roles ”部分。

图片


除了管理员和匿名用户的角色之外,我建议分配“ Downloader ”类型的角色(用于将依赖项加载到项目中),分配“ Contributor ”类型的角色,用于将库发送到Nexus。

单击“创建角色”,然后选择“ Nexus角色”,为“下载程序”输入数据,如以下屏幕截图所示:

图片


什么特权负责文档中详细描述的内容 。 我们需要选择一个带有“ repository-view ”标记的特权(它负责处理存储库的数据),该特权还应赋予读取存储库数据的权限,这就是“ read ”标记,并且由于在Android中我们使用maven存储库,因此值得停留在“ maven2 ”标志上,以防止用户使用其他类型的存储库。 点击“ Create role ”。

以此类推,我们创建了“ Contributor ”角色。 唯一的区别是,我们将从“ Downloader ”角色(在页面底部设置)继承读取权限,并且我们将拥有编辑,向存储库添加工件以及通过Web界面查看存储库数据的特权。

图片


接下来,创建将为其分配已配置角色的用户。 我们转到“ Users ”部分(在窗口左侧),然后单击“ Create local user ”。 为了进行验证,您可以设置类似于标准管理员密码的密码,即“ downloader123 ”和“ contributor123 ”。 屏幕上的样品填充:

图片


由于我们的目标是私人工作,因此值得匿名用户访问存储库数据,为此,请转到用户“ anonimous ”并将其状态从“ Active ”更改为“ Disabled ”。 在这种情况下,将无法匿名获取Android项目中的依赖关系,而只能使用特定的用户名和密码来获取依赖关系,但仍可以通过Web界面下载数据。

为了禁止匿名用户通过Web界面查看存储库的内容,请转到“ Allow anonymous users to access the server ”部分,然后取消选中“ Allow anonymous users to access the server ”选项。 记住要保存更改。

最后一步仍然是-建立存储库。 转到“ Repositories ”部分,查看在那里创建的默认存储库。 其中有存储库“ maven2 ”,如果仔细查看,您会看到不同的类型:“代理”,“组”,“托管”。 如果代理存储库只是将用户转发到另一个存储库,则在预先配置的“ maven-central ”的情况下,这是指向https://repo1.maven.org/maven2/的链接,“组”可能包含多个存储库,并且“托管”已经是Nexus中存储的特定存储库。 它们现在对我们有用。

为工件的“发行”和“快照”版本创建存储库。 单击“ Create repository ”,选择“ maven2 (hosted) ”。 我们将第一个存储库称为“ android”,只需保存它而不更改设置即可:

图片


我们将第二个存储库称为“ android_snapshot”,将“ Version policy ”更改为“ Spapshot”,将“ Deployment policy ”更改为“允许重新部署”。

图片


如果不清楚这会影响什么,则可以在此处阅读。 实际上,“ android”存储库将无法重复下载相同版本的库,这是例如与maven-central通信时的常见行为。 对于android_snapshot存储库,版本名称必须以SNAPSHOT结尾,并且可以再次下载相同的版本。

还需要注意的是,存储库列表中有一个带有“复制”按钮的“ URL”列,将来,我们将需要这些链接来从项目中访问存储库。

恭喜你! Nexus的基本配置已完成,是时候开始创建和发布该库了。

步骤3.创建和发布Android库


我们创建一个Android项目,将其命名为“ TestLibrary”。 接下来,在“项目视图”中,用鼠标右键单击项目根目录,选择“新建”和“模块”。 在打开的窗口中,选择“ Android库”并将库命名为“ HelloLibrary”。 结果,您将在app模块旁边看到我们新库的模块。

图片


将具有欢迎功能的类添加到库中:

 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 } 

现在,与任何其他库一样,通过在“应用”级别的“ 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:versiongroupId:artifactId:version

现在,您可以在Android项目中调用helloFromOurLibrary()函数,并测试整个电路的性能。 恭喜你!

总结


现在,您有机会在项目中重用私有Android库。 等待评论!

希望您没有浪费时间,谢谢!

Source: https://habr.com/ru/post/zh-CN416665/


All Articles