如何为内部 Android 库分发设置私有 Maven 存储库

如何为内部 Android 库分发设置私有 Maven 存储库

昨天我收到了一个问题:“最终,android 项目中将放置大量库模块。组织这些库以供当前和未来使用的最佳和可持续的方式是什么?”。

好吧,我认为这个问题非常好,我相信你们中的许多人可能有同样的疑问,所以我决定写这篇博客,向您介绍如何**“设置自己的私有 Maven 存储库”**以供内部使用。

让我们开始吧。

我们为什么要设置私有 Maven 存储库?

显然,一个 Android 库模块实际上只是在同一目录中分组的一堆源代码。如果您想让其他开发人员使用您的库,您可以简单地将整个目录发送给他们,让他们将其包含在他们的项目中。

img

听起来容易,但并不意味着它是好的。问题是 “如果公司开始发展,项目量开始不断增加,我们还是像这样将库作为源代码传递好吗?”

答案是坚决不。**不要那样做!以下是您需要关注的一些重要原因:

  1. 让我们想象一下。如果您有大约 10 个项目共享同一个库模块。最后,你会发现这些项目中散落着源代码的副本,这完全不利于代码控制。

  2. )将库更新到新版本很不方便。过程如下:下载源代码,复制它,用新的替换旧的,检查是否有问题,等等……你必须手动完成每一步。

  3. 如果你有时候状态不好了,更新版本的库可能会导致你以前工作过的应用程序进入不可用。在这种情况下,您需要将库回滚到以前的版本。哇哦,这意味着我们需要保留每个版本的源代码作为备份,以防有一天我们可能会遇到麻烦。

  4. 在使用方面,我们需要分发库让其他开发者**“使用”**它。所以没有必要让他们看到源代码。只需一份清晰的文档如何使用库就足够了。

  5. 库分发到其他开发者应该不会是可修改的。如果出现问题,应将问题报告给相关的开发人员,让他们解决。让其他开发人员直接访问源代码可能会导致他们不小心自己进行了快速修复,这将导致以后出现大问题。

这就是为什么我们不应该将库作为源代码分发的原因。在这种情况下,更好的方法是分发库的内置版本, 以 .jar或.aar文件的形式。

img

虽然它看起来更好,但它并不完美。上面列出的大部分问题都解决了,除了一个: 更新和回滚版本仍然很难。我们仍然需要下载、复制、替换、备份,等等等等。开发人员的时间很宝贵,不应该浪费在这些事情上。

如果我们可以build.gradle像包含第三方库一样在的依赖项区域中添加一行代码会更好吗,例如,

compile 'my.company:library:1.1.0'
复制代码

如果您对新版本的库有任何问题,只需在一秒钟内将版本号更改回可用的版本号即可。

compile 'my.company:library:1.0.0'
复制代码

我发现这是个完美选择。分发库很容易,如果要使用,只需添加一行代码即可完成!更新和回滚到您想要的任何版本也非常容易。而且源代码也是不可修改的。

所以我鼓励每家公司都有一个 Maven 存储库来在内部使用。因为我们在内部使用它,所以这些库应该是私有的,所以公共存储库不是一个选择。我们必须使用具有完整访问控制系统的私有 Maven 存储库,以便除了团队成员之外没有人可以访问该库。

img

为此,我们有两个选择:

  1. 使用私有存储库托管服务 – 有很多这样的服务。最受欢迎的是 Bintray PremiumJitPack Private Repositories。无论如何,它非常昂贵(至少对我而言)。此外,您需要在那里托管的库工件数量将向您收取更多费用。对我来说,一年内库工件的数量可能会增加到 10 个,这对于长期使用来说不是一个好的选择。

  2. 设置您自己的专用服务器 – 有很多开源软件可供您选择,为您提供完美的解决方案,例如 Artifactory 和 Nexus。您可以根据需要放置任意数量的库工件。您唯一需要支付的费用是托管费,如今这不再是一个大问题。使用 DigitalOcean,您每月只需支付 10 美元。就这样。听起来很酷,对吧?

好的,我会教你如何将我们自己的私有 Maven 存储库设置为专用服务器。我选择的开源软件是Artifactory, 因为它非常容易安装,尽管它有无数有前途的功能和稳定性。

Artifactory 安装

我知道你们都必须有自己最喜欢的操作系统,但为了方便起见,让我稍微控制一下托管环境。在这篇博客文章中,我将指导您如何在 DigitalOcean上的Ubuntu 14.04 LTS上设置 Artifactory 。如果您不想支付任何费用,也可以在VirtualBox 上的 VM 选择喜欢的。

创建 Ubuntu 14.04 LTS Droplet

首先,让我们在 DigitalOcean 上创建一个具有以下规范的 Droplet:

OS: Ubuntu 14.04 LTS

规格: 10 美元/月

地区: 任何地区,但我建议您选择离您最近的服务器。

img

创建Droplet后,请将root用户名和密码发送到您的电子邮件,然后通过ssh 进入创建的服务器。

安装 Java 8

Java 8 不附带 Ubuntu 14.04 LTS 的默认存储库。我们需要通过 PPA 存储库安装它。您可以使用以下命令行执行此操作:

# add-apt-repository ppa:webupd8team/java
# apt-get update
# apt-get install oracle-java8-installer
复制代码

您可以通过输入此命令来验证安装。

# java -version
java version "1.8.0_72"
Java(TM) SE Runtime Environment (build 1.8.0_72-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.72-b15, mixed mode)
复制代码

完毕。

安装 Artifactory

安装很容易。首先需要从bintray下载Artifactory的debian包:

$ wget https://bintray.com/artifact/download/jfrog/artifactory-debs/pool/main/j/jfrog-artifactory-oss-deb/jfrog-artifactory-oss-4.5.1.deb
复制代码

本教程中使用的版本是 4.5.1,因为它是我写这篇博文时的最新版本。随意使用您喜欢的任何其他版本。Bintray 站点中提供了 Artifactory 版本号列表 。

现在是时候用这 4 行代码安装它了。当然,如果您使用 4.5.1 以外的其他版本,请不要忘记将 deb 包的数量更改为您正在使用的数量。

$ gpg --keyserver pgpkeys.mit.edu --recv-key 6B219DCCD7639232 
$ gpg -a --export 6B219DCCD7639232 | sudo apt-key add -
$ apt-get update
$ dpkg -i jfrog-artifactory-oss-4.5.1.deb
复制代码

差不多一分钟内就安装完成。您可以使用此命令立即启动服务。

# service artifactory start
复制代码

Tomcat 已经嵌入 Artifactory 包中,因此您无需安装任何其他东西。现在可以独立使用了。

配置 Artifactory

打开您的首选浏览器并浏览到此网址:( http://IPADDRESS:8081/artifactory/ 将 IPADDRESS 替换为您服务器的 IP 地址)。您将看到如下所示的登录屏幕:

img

使用用户名: admin密码登录**:** password

我建议您在登录后立即做的第一件事是更改您的管理员密码以防止进一步的安全问题。为此,请浏览到 Admin -> Security -> Users -> admin 将密码更改为您想要的。

img

无论如何,我们不应该以管理员身份使用仓库。因此,我们将像这样保留帐户并创建一个新帐户。下面是如何一步一步地做到这一点。

创建组

浏览到 Admin -> Security -> Groups 并单击右上角的 +New

img

我们将创建一个用户组,他们能够从系统上传和下载任何库。因此,我将该组命名为**“贡献者”,描述为“仓库贡献者组”**。对于用户窗格,保持不变。

img

单击 保存 以创建组。

创建权限

下一步是为贡献者组中的用户分配权限。浏览到 Admin -> Security -> Permissions 并单击右上角的 +New

img

将权限命名为 Contribute to Anything 并选中 Any Local RepositoryAny Remote Repository 框,以获得对系统中任何存储库的访问权限给贡献者。单击 下一步。

img

在 Groups 选项卡中,将贡献者添加 到右侧区域并分配如下权限 。单击 保存并完成

img

现在权限已分配给贡献者组。

创建一个新的用户帐户

最后一步是创建一个分配了贡献者权限的新用户帐户。单击 Admin -> Security -> Users页面 右上角的 +New

img

输入 用户名密码电子邮件地址。在 相关组 区域,请仅将 贡献者 组添加到右侧窗格。

img

单击保存并…完成!我们现在获得了一个具有适当权限的帐户。

如果您想在此之后创建更多具有相同访问权限的用户帐户,您可以通过创建一个新用户并将其添加到贡献者组来实现。

但是,如果您想创建一个具有只读访问权限的用户帐户。 在这种情况下,读者是您需要分配给该帐户的组。

获取加密密码

下一步需要在gradle脚本中使用password,最好不要使用明文版本的password。幸运的是,Artifactory 提供了一种使用加密密码的方法,要获取此信息,您需要从 admin 注销并使用在上一步中创建的帐户登录

登录后,单击页面右上角的用户名。

img

输入您的密码,然后单击解锁。

img

一些数据将被展示出来。

img

复制加密密码 框中的文本 并将其保存在某处。我们将在不久的将来使用它。

将 Artifactory 切换到私人模式

在默认设置中,托管在 Artifactory 中的存储库是可公开访问的。我们需要切换到私有模式,只让允许的用户访问存储库。

要打开私人模式,只需在 管理 -> 安全 -> 常规 页面中取消选中允许匿名访问

img

服务器现已配置完毕,可以使用了!

如何从 Android Studio 将 Android 库上传到 Artifactory

现在是时候开始在 Android Studio 上工作了。要将库上传到 Artifactory,我们需要修改一些 gradle 脚本。第一步是为上一步设置的 Artifactory 上的帐户定义用户名加密密码。由于这些信息将在 gradle 脚本中可见,因此我们最好将它们放在不会上传到版本控制的文件中。让我们把它们放进 HOME_DIR/.gradle/gradle.properties

对于那些不熟悉这个文件的人,它是一个全局 gradle 脚本,用于每个 gradle 项目的编译步骤。所以如果我们在这个文件中声明任何东西,这些数据也可以在 Android 项目的 gradle 脚本中访问。

我相信您,开发人员,必须已经知道HOME_DIR 对于每个操作系统是什么 。对于 Mac OS XLinux,它是 ~Windows 中,它是 C:\Users\USERNAME 一般情况。尝试浏览到该文件夹,您将.gradle在那里看到目录。如果没有,你就进入了错误的目录。

如果目录不存在则gradle.propertiesHOME_DIR/.gradle/目录中创建一个 文件, 如果存在则修改它。添加如下两行脚本,并将YOUR_USERNAMEYOUR_ENCRYPTED_PASSWORD替换 为您 在上一步中获得的用户名和加密密码。

# HOME_DIR/.gradle/gradle.properties

artifactory_username=YOUR_USERNAME
artifactory_password=YOUR_ENCRYPTED_PASSWORD
复制代码

现在打开 build.gradle 放置在 Android 项目顶层的文件。添加classpath如下一行代码。

buildscript {
    dependencies {
        // Add this line
        classpath "org.jfrog.buildinfo:build-info-extractor-gradle:4.0.1"
    }
}
复制代码

打开build.gradle 放置在您需要上传到 Artifactory 的库模块中。在文件的第一行插入如下所示的两行代码。

apply plugin: 'com.jfrog.artifactory'
apply plugin: 'maven-publish'
复制代码

并在同一个工作文件的末尾添加这些行。

def libraryGroupId = 'my.group.package'
def libraryArtifactId = 'thelibrary'
def libraryVersion = '1.0.0'
复制代码

上面显示的代码将导致依赖的形式,因为 compile 'my.group.package:thelibrary:1.0.0' 它在存储库中可用。请随时将 libraryGroupId、libraryArtifactId 和 libraryVersion 更改 为您想要的任何内容。

在同一个工作文件中,在文件末尾添加这些行。

publishing {
    publications {
        aar(MavenPublication) {
            groupId libraryGroupId
            version libraryVersion
            artifactId libraryArtifactId

            artifact("$buildDir/outputs/aar/${artifactId}-release.aar")
        }
    }
}

artifactory {
    contextUrl = 'http://IPADDRESS:8081/artifactory'
    publish {
        repository {
            repoKey = 'libs-release-local'

            username = artifactory_username
            password = artifactory_password
        }
        defaults {
            publications('aar')
            publishArtifacts = true

            properties = ['qa.level': 'basic', 'q.os': 'android', 'dev.team': 'core']
            publishPom = true
        }
    }
}
复制代码

并且不要忘记将IPADDRESS更改为您服务器的 IP 地址。

Ok。现在脚本准备好了!

上传库

上传库非常容易。只需在 Android Studio 中打开终端即可

img

并输入以下命令。

Windows:

gradlew.bat assembleRelease artifactoryPublish
复制代码

Mac OS X & Linux:

./gradlew assembleRelease artifactoryPublish
复制代码

让它完成它的工作并等待 BUILD SUCCESSFUL 显示在屏幕上。

img

在这一步,您的库现已成功上传到您的私有 Maven 仓库。恭喜 !

验证上传二进制文件

浏览到您的 Artifactory 控制面板 http://IPADDRESS:8081/artifactory ,然后单击 Artifacts -> libs-release-local。您将看到上传的库显示在其中,其中包含一些元数据,例如部署者的用户名。

img

可以通过浏览器访问存储库 http://IPADDRESS:8081/artifactory/libs-release-local/。请随时给支票。

仓库的使用

仓库现在可以使用了。要在您的项目中使用它,您需要声明指向存储库地址的 maven url 以及项目级别 内的凭据build.gradle

添加 **maven { … }**部分代码,如下所示:(当然,不要忘记将 IPADDRESS 更改为您服务器的 IP 地址)

allprojects {
    repositories {
        jcenter()
        // Add these lines
        maven {
            url "http://IPADDRESS:8081/artifactory/libs-release-local"
            credentials {
                username = "${artifactory_username}"
                password = "${artifactory_password}"
            }
        }
    }
}
复制代码

打开 build.gradle 您想要使用库的内部模块,然后简单地添加一个非常熟悉的形式的依赖项。

dependencies {
    compile ''my.group.package:thelibrary:1.0.0"
}
复制代码

现在一切都完成了。您现在可以:

  • 设置您自己的 Maven 仓库(私有或公共存储库)
  • 将库上传到具有完全用户访问控制的存储库。
  • 从具有完全用户访问控制的存储库下载库。

仓库的分发比任何其他分发方法都更加系统化,现在您拥有多少个库或多少个库版本都无关紧要。现在一切都井井有条。=)

希望你会发现这个博客有用!

如果你对这个博客感兴趣,这篇“如何通过 jCenter 和 Maven Central 从 Android Studio 分发你自己的 Android 库”可能也有。如果您想将自己的库上传到公共标准 Maven 存储库(如 jcenter 或 Maven Central),该博客将向您展示如何操作。再次,希望你觉得它有用=)

干杯。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享