使用 Mavin Publish Gradle 插件将 Android 库发布到 Azure Artifacts

15 篇文章 0 订阅
10 篇文章 0 订阅

在本文中,我们将使用 Mavin Publish Plugin 配置一个 android 库并将其发布到 Azure Artifacts,然后在 android 应用程序中使用它

首先让我们假设您已经创建了一个现有的 android 库并配置了 gradle并假设您的库模块created 被称为“common-utils”。您的项目结构应类似于以下结构:

基本概念和术语

为了能够将库发布到 maven 存储库,我们需要使用 Mavin Publish Gradle 插件配置库,但首先我们需要解释一些概念和定义,这就是我们要做的(以下所有定义都被视为来自文档,在其他时候我编辑了定义以便更容易理解)。

工件:由构建生成的文件或目录,例如 JAR、ZIP 分发或本机可执行文件。

模块:随着时间的推移而发展的软件,例如 Google Guava。每个模块都有一个名称。模块的每个版本都由模块版本最佳地表示。

模块元数据:模块的发布提供元数据。元数据是更详细地描述模块的数据,例如有关工件位置或所需传递依赖关系的信息。Gradle 提供了自己的元数据格式,称为 Gradle 模块元数据(.module 文件),但也支持 Maven 元数据(.pom)。

模块版本:表示已发布模块的一组不同的更改。例如 18.0 表示模块的版本,坐标为com.google:guava:18.0。

存储库:存储库托管一组模块,每个模块可以提供一个或多个由模块版本指示的版本(组件)。

Maven Repository:包含额外元数据的打包 JAR 文件的目录(元数据由 POM 文件表示)并包含所有项目 jar、库 jar、插件和任何其他项目特定的工件。这些打包的 JAR 文件可以被 Maven、Gradle 和其他了解 Maven 存储库格式的工具使用,并在将它们添加为依赖项后在其他项目中使用。

Gradle 插件:它们添加新任务(例如 JavaCompile)、域对象(例如 SourceSet)、约定(例如 Java 源代码位于 src/main/java)以及从其他插件扩展核心对象和对象。Gradle 的核心是故意为现实世界的自动化提供很少的东西,所有有用的特性,比如编译 Java 代码的能力,都是由插件添加的。

发布:是将正在构建的事物提供给消费者的过程。它可以是其他软件项目使用的库,也可以是最终用户的应用程序。在 Gradle 中,该过程如下所示:

  • 定义要发布的内容
  • 定义将其发布到的位置
  • 做出版

这些步骤中的每一个都取决于您要将工件发布到的存储库的类型。

Maven Publish Plugin:是一个 gradle 插件,它提供了将构建工件发布到 Apache Maven 存储库的能力,并允许您配置要发布的内容并以最少的努力执行发布。发布到 Maven 存储库的模块可以被 Maven、Gradle 和其他了解 Maven 存储库格式的工具使用。

Gradle Maven Publication:发往 Maven 存储库的出版物,其中包括:

  • 一个或多个工件——通常由项目构建。
  • Gradle 模块元数据文件将描述已发布组件的变体。
  • Maven POM 文件将识别主要工件及其依赖项。主要工件通常是项目的生产 JAR,次要工件可能由“-sources”和“-javadoc”JAR 组成。

现在我们已经了解了一些术语和定义,让我们继续了解如何使用 Mavin Publish Gradle 插件配置 android 库。

使用 Maven 发布插件配置 Android 库

  1. 让我们首先将 Maven Publish Plugin 添加到 android 库中,方法是将此插件添加到“common-utils”模块(这是我们现有库的 gradle 模块)中 build.gradle 文件的 plugins 部分:
 plugins {
     id 'com.android.library'
     id 'kotlin-android'
     id 'maven-publish'
 }
  1. 将插件添加到插件部分后,您将看到 gradle 文件已更改的选项,并建议同步 gradle 文件。单击“立即同步”并等待 gradle 同步完成。

  2. 我们需要定义两件事:publications(发布什么)和repositories(在哪里发布)。Maven Gradle 插件提供了通过在依赖块之后的“common-utils”模块的 build.gradle 文件中添加以下发布块(由 PublishingExtension 支持)来定义发布的能力。
 publishing {

 }

  1. 我们需要定义发布块并定义一个maven发布块(我们将详细解释)。为此,请在发布块中添加以下代码块。
 publishing {
     publications {
         release(MavenPublication) {
             from components.release

             groupId 'com.example'//<GROUP_ID>
             artifactId 'commonutils-release'//<ARTIFACT_ID>
             version '0.1.0'// Your package version
         }
     }
 }


让我们更详细地解释我们添加的代码块以及每一行的含义:

  • release(MavenPublication) { }:创建一个名为“release”的 Maven 发布块,该块可以发布到由大括号之间的类型指示的 Maven 存储库。
  • from components.release:表示此发布仅包含发布 AAR 工件及其元数据,方法是应用项目的发布组件来构建发布构建变体(将在 gradle 生成的任务中使用)。
  • groupId ‘com.example’:定义此发布的包的组 ID(将在其他项目中使用该库时使用)。
  • artifactId ‘commonutils-release’:定义此发布的包的工件ID(将在其他项目中使用该库时使用)。
  • version ‘0.1.0’:定义此发布的包的版本(将在其他项目中使用该库时使用)。

注意:Maven 将 groupId 和 artifactId 限制为有限的字符集 ([A-Za-z0-9_-.]+),Gradle 强制执行此限制。对于版本(以及工件扩展和分类器属性),Gradle 将处理任何有效的 Unicode 字符。明确禁止的唯一 Unicode 值是 \、/ 和任何 ISO 控制字符。提供的值在发布的早期就得到验证。

  1. 我们需要定义存储库块,这些存储库是 gradle 可以向它们发布工件的存储库。为此,请在发布块中添加以下代码块。
 repositories {
         maven {
             name = 'azure'
             url 'https://pkgs.dev.azure.com/'
             credentials {
                 username "user name"
                 ~~password "password"~~ #由于不能这个不能发出来,前面和后面的~~是多余的
             }
         }
 }


让我们更详细地解释我们添加的代码块以及每一行的含义:

  • maven {}:指示存储库的类型,在这种情况下,它是一个 Maven 存储库。
  • name = ‘azure’: 确定 maven 存储库的名称(将在 gradle 生成的任务中使用)。
  • url ‘https://pkgs.dev.azure.com/’:确定我们要发布到它的 maven 存储库的 url 位置。
  • credentials {},username "user name"和password “password”: 配置连接到之前定义的存储库 url 所需的任何身份验证详细信息(稍后将详细讨论)。

笔记:

  • Gradle 需要与存储库交互,这就是为什么您必须提供存储库的类型、位置以及连接到存储库所需的身份验证详细信息的原因。

  • 您可以定义多个存储库,只要它们在构建脚本的存储库块中具有唯一名称。您还可以声明一个(并且只有一个)没有名称的存储库。该存储库将采用“Maven”的隐式名称。

  1. 如果我们尝试单击“立即同步”(在 build.gradle 文件更改后出现),我们将收到错误消息A problem occurred evaluating project ‘:common-utils’. > Could not get unknown property ‘release’ for SoftwareComponentInternal set of type org.gradle.api.internal.component.DefaultSoftwareComponentContainer.。

    这是由于 gradle 中的一些更改和弃用而发生的,这是Removal of deferred configuration behaviorgradle 官方文档解释如下:

在 Gradle 5.0 之前,发布 {} 块(默认情况下)被隐式处理,就好像它内部的所有逻辑都是在评估项目后执行的。这种行为引起了相当多的混乱,并在 Gradle 4.8 中被弃用,因为它是唯一具有这种行为的块。您的发布块或插件中可能有一些依赖于延迟配置行为的逻辑,这种逻辑现在必须包装在 afterEvaluate {} 块中。

换句话说,这意味着the components are created only during the afterEvaluate phase and you must configure your publications using the afterEvaluate() lifecycle method(有关更多详细信息,请查看有关项目生命周期的官方文档)。因此,我们需要将发布块(其中包含发布块和存储库块)包装在 afterEvaluate {} 块中,如下面的代码所示:

 afterEvaluate {
     publishing {
         publications {
             release(MavenPublication) {
                 from components.release

                 // You can then customize attributes of the publication as shown below.
                 groupId 'com.example'//<GROUP_ID>
                 artifactId 'commonutils-release'//<ARTIFACT_ID>
                 version '0.1.0'// Your package version
             }
         }
         repositories {
             maven {
                 name = 'azure'
                 url 'https://pkgs.dev.azure.com/'
                 credentials {
                     username "user name"
                     password "password"
                 }
             }
         }
     }
 }


并且不要忘记在 android studio 提示时点击“立即同步”!

恭喜!,您终于在现有的 android 库中完成了 maven 发布插件的配置。接下来,我们将深入探讨如何配置和准备 Azure 以使用 Azure Artifacts 托管 maven 存储库。

配置和准备 Azure 工件以托管 Maven 存储库
Azure Artifacts 是 Azure DevOps 中的一项服务,由官方文档定义:

Azure Artifacts 使开发人员能够共享和使用来自不同源和公共注册表的包。包可以在同一团队、同一组织甚至公开共享。Azure Artifacts 支持多种包类型,例如 NuGet、npm、Python、Maven 和通用包。

我们对 Maven 支持感兴趣,因为它是我们可以将现有 maven android 库发布到的存储库类型,为此我们需要按照以下步骤配置 Azure DevOps:

您需要在 Azure DevOps 上创建一个名为“CommonUtils”的天蓝色项目(这是我们要发布的库的名称)。如果您不知道如何在 Azure DevOps 上创建项目,请参阅本指南并按照上述步骤进行操作。按照步骤创建新项目后,您应该在选择创建的项目时看到以下内容。

单击左侧菜单中的 Artifacts,您将进入 Artifacts 的登录页面,该页面将包含您在项目中拥有的所有 Feed。默认情况下,选定的提要称为“CommonUtilsDemo”(这是为该项目所属的组织创建的默认提要,组织名称为“CommonUtilsDemo”,它是为本文目的而创建的)。


什么是 Azure 工件源?

Artifacts Feeds 是一种组织结构,允许您存储、管理和分组您的包并控制与谁共享它。提要不依赖于包类型。您可以将以下所有包类型存储在一个提要中:npm、NuGet、Maven、Python 和通用包(有关工件提要的更多详细信息,请查看本指南)。

您可以使用默认提要发布您的库,也可以创建一个新提要。对于我们来说,我们将使用名为“CommonUtilsDemo”的默认提要。

从“创建提要”按钮旁边的菜单中选择目标提要后,您将看到一条消息,鼓励您连接到提要,并在其下方标有“连接到提要”的按钮。

单击此按钮时,您将获得可供选择的工件类型列表。在 Maven 部分下,您将找到 Gradle 和 Maven,单击 Gradle。

当您单击 Gradle 时,您将在页面右侧打开一个项目设置指南。从 maven{} 块内的设置说明中,您将找到一个带有值的 url 和一个名称变量,保存这些值,因为我们需要它们来配置我们添加的存储库块中的 maven{} 块。

您需要创建一个个人访问令牌(当我们想要在 azure 工件上发布 android 库或当 gradle 想要将其作为依赖项下载时,我们将在身份验证中使用它)。为此,您可以从上一步页面右侧打开的相同设置说明访问您的个人令牌,您将被重定向到个人访问令牌页面以创建一个新令牌,或者您可以按照本指南创建一个新的个人访问令牌。


创建个人访问令牌后,请将其与我们在上一步中保存的 url 和名称值一起保存,因为我们稍后将需要它们。

打开 Android Studio 并在项目的根目录下创建一个名为“ azure-configs.properties ”的新文件。创建此文件后,将 [您的提要名称]、[个人访问令牌] 和 [提要的 URL] 的值替换为您在前两个步骤中保存的值,然后在其中粘贴以下内容。

 azureMavenAccessToken=[you personal access token]
 userName=[name of the feed]
 repositoryUrl=[url of the feed]


当您将此文件中的值替换为您保存的值时,您应该会得到与以下内容类似的结果:

 azureMavenAccessToken=r6qezlulkov72amh2kzbhhkuzulgssbecqlw4k3enttdcnx5hlza
 userName=CommonUtilsDemo
 repositoryUrl=https://pkgs.dev.azure.com/CommonUtilsDemo/_packaging/CommonUtilsDemo/maven/v1


注意:不要尝试使用个人访问令牌,因为它只是为了本文的目的而创建的,并且出于安全原因在我完成文章后立即删除;)

创建文件“ azure-configs.properties ”后,打开“common-utils”库模块的 build.gradle 文件,并在 plugins 块之后添加以下代码(加载我们创建的文件的值“ azure -configs.properties ”,以便能够在发布块内的 gradle 脚本中使用它们以及我们接下来要做的事情)。

 def keystorePropertiesFile = rootProject.file("azure-configs.properties")
 def keystoreProperties = new Properties()
 keystoreProperties.load(new FileInputStream(keystorePropertiesFile))


注意:您不应检查版本控制中的“ azure-configs.properties ”,因为这样做会特别暴露个人访问令牌(如果它是开源项目)。我这样做只是为了向本文的读者提供包含此文件的完整示例项目。

打开“common-utils”库模块的 build.gradle 文件并在 maven 块内添加以下代码(在 afterEvaluate 块内的发布块内的 repositories 块内)。

 maven {
                 name = 'azure'
                 url keystoreProperties['repositoryUrl']
                 credentials {
                     username keystoreProperties['userName']
                     password keystoreProperties['azureMavenAccessToken']
                 }
             }


通过添加这个代码块,我们使 gradle 构建脚本能够从我们创建的文件中读取值,并将它们与发布块中的 maven publish gradle 插件一起使用。

当android studio提示时,不要忘记点击“立即同步”!

恭喜!您已经在 Azure DevOps 上配置了 Azure Artifacts,准备好托管一个 maven 存储库,并将配置添加到 maven 发布 gradle 插件,以便能够在 Azure Artifacts 上发布您现有的 android 库,我们将要做下一节。

将 Android 库发布到 Azure Artifacts

我知道你很高兴看到所有这些如何与发布 android 库相关联,但在我们这样做之前,我们需要了解一些我们之前跳过的概念。

Maven Publish Plugin 在项目中使用了一个名为 publishing 的扩展,类型为 PublishingExtension,我们之前在添加带有发布和存储库块的发布块时使用了该扩展。Maven Publish Plugin 提供了一些 gradle 任务来处理发布并提供我们将要使用的功能。因此,让我们探索一下这些任务以及每个任务的用途,因为它们由官方文档定义如下:

generatePomFileForPubNamePublication — GenerateMavenPom 为名为 PubName 的发布创建 POM 文件,填充已知的元数据,例如项目名称、项目版本和依赖项。POM 文件的默认位置是 build/publications/$pubName/pom-default.xml。

publishPubNamePublicationToRepoNameRepository — PublishToMavenRepository 将 PubName 发布发布到名为 RepoName 的存储库。如果您有一个没有明确名称的存储库定义,则 RepoName 将为“Maven”。

发布 取决于:所有 publishPubNamePublicationToRepoNameRepository 任务 将所有已定义的发布发布到所有已定义存储库的聚合任务。它不包括将发布复制到本地 Maven 缓存。

要将这些任务映射到我们现有的 android 库,我们希望有这些任务:

  • generatePomFileForReleasePublication(因为 PubName = Release)
  • publishReleasePublicationToAzureRepository(因为 PubName = Release 和 RepoName = Azure)
  • 发布

我们只对 publishReleasePublicationToAzureRepository 感兴趣,我们将使用它来演示如何发布库并按照以下步骤进行操作:

  1. 在 Android Studio 中,打开 gradle 工具窗口,其中包含“根项目”中的所有 gradle 任务、“app”模块中的 gradle 任务以及“common-utils”模块中的所有 gradle 任务。
  2. 单击“common-utils”旁边的箭头->“任务”->“发布”。您将找到我们之前提到的 Maven Publish Gradle 插件为我们为“common-utils”生成的任务。我们可以双击这些任务中的任何一个来触发 gradle 来执行这个任务,或者点击名为“发布”的任务来触发所有的任务。
  3. 要发布我们现有的 android 库,我们将执行名为“publishReleasePublicationToAzureRepository”的任务,它将我们的库的发布版本(AAR 发布)部署到我们之前配置的 Azure 存储库。我们可以通过在打开的 gradle 工具窗口中简单地双击它来执行此任务(或者通过在根项目目录中打开终端并运行命令./gradlew publishReleasePublicationToAzureRepository),这将构建 android 库和所有必需的文件并将其发布到 Azure Artifacts
  4. 导航到 Azure DevOps 上名为“CommonUtils”的项目并打开 Artifacts 服务,将找到已发布的库,如下所示:

    恭喜!您已经在 Azure Artifacts 上发布了现有的 android 库,现在可以在其他 android 项目中使用它,我们将在下一节中介绍。

在另一个应用程序中使用已发布的 Android 库

要在应用模块中使用已发布的 android 库,我们需要删除对“common-utils”的本地依赖,并将其替换为对 Azure Artifacts 上已发布库的依赖。为此,您可以按照以下步骤操作:

  1. 打开“settings.gradle”文件并删除dependencyResolutionManagement {} 块(如果有)。我们这样做是为了能够在我们将在下一步中执行的应用程序模块中定义存储库块。
  2. 删除 dependencyResolutionManagement {} 块后,您的 settings.gradle 文件应该只有以下代码:
 rootProject.name = "CommonUtils"
 include ':app'
 include ':common-utils'

  1. 打开 ‘app’ 模块的 build.gradle 文件,在 plugins {} 块之后添加以下代码(它加载我们创建的文件“ azure-configs.properties ”的值,以便能够在 gradle 中使用它们稍后编写脚本):
 def keystorePropertiesFile = rootProject.file("azure-configs.properties")
 def keystoreProperties = new Properties()
 keystoreProperties.load(new FileInputStream(keystorePropertiesFile))

  1. 打开 ‘app’ 模块的 build.gradle 文件,在 dependencies{} 块implementation project(path: ‘:common-utils’)中将implementation ‘com.example:commonutils-release:0.1.0’. 添加此行后,我们将应用程序模块的依赖项从对“common-utils”库的本地依赖项更改为依赖于 Azure Artifacts 上的远程发布库。

  2. 打开 ‘app’ 模块的 build.gradle 文件,在 dependencies{} 块之后添加 repository 块(这将有助于 gradle 在安装 app 模块的所有依赖项时找到已发布的库),方法是添加以下代码:

 repositories {
     maven {
         name = 'azure'
         url keystoreProperties['repositoryUrl']
         credentials {
             username keystoreProperties['userName']
             password keystoreProperties['azureMavenAccessToken']
         }
     }
 }

  1. 您将看到 gradle 文件已更改的选项以及同步 gradle 文件的建议。单击“立即同步”并等待 gradle 同步完成(当 gradle 同步时,gradle 会遍历依赖项并下载它们,包括已发布的 android 库)。

  2. 打开模块“common-utils”(这是模块中唯一的文件)中的 Utils.kt 文件,您只会看到一个定义为“concatenateTwoStrings()”的函数。然后在第 21 行打开 app 模块中的 MainActivity.kt,您会发现我们正在使用已发布库中的实用程序函数,没有错误(这意味着您实际上添加了从 azure Artifacts 存储库到您的项目的库)。

  3. 为确保一切正常,您可以构建并运行该应用程序,您将获得以下信息:

这意味着我们将 Azure Artifacts 中已发布的 utils android 库添加到了应用程序模块中,并在另一个应用程序中成功使用了它!

最后

在本文中,我们介绍了如何配置现有的 android 库以使用Mavin Publish Gradle 插件将 android 库发布到Azure Artifacts,然后在另一个 android 应用程序中使用已发布的库。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值