要授予对您的库的访问权限,您需要选择一个仓库。本页将指导您了解选择仓库类型时的注意事项,并展示如何使用 Maven Publish 插件创建发布。
在上传您的库之前,请确保您已准备好发布您的库并配置了任何必要的发布变体或测试工具。
选择仓库类型
库以 AAR 文件形式发布。这些文件包含编译后的字节码和原生库、Android 清单以及资源。包本身不声明任何身份、版本或对其他库的依赖项。
通常,通过仓库提供 AAR 是最佳实践,而不是直接分发 AAR。这有助于用户更好地了解库的来源,而不必处理一个缺少重要细节(如版本)的 name.aar
文件。当升级到库的较新版本时,使用仓库可确保仅添加新版本所需的依赖项,这样用户就不必手动更新依赖项。
使用仓库发布您的库有多种好处
- Gradle 可以自动将您的库的依赖项添加到依赖图。
- 如果您的库以不同版本多次传递性地包含在依赖图中,Gradle 可以确保您的库在依赖图中只有一个版本,从而解决冲突。
- 如果您的库使用 Java 8 或更高版本的语言特性,Android Gradle 插件 (AGP) 可以进行更高效的脱糖处理,从而缩短用户的构建时间。
- 您的库可以使用变体发布并包含测试工具等功能。
直接分发 AAR 不会向用户提供有关您的库的身份、版本或依赖项的任何信息。发布到仓库时,分发由作为仓库机制一部分的单独文件处理。对于 Maven 仓库,这是 POM 文件。因此,强烈建议使用仓库发布库,而不是手动分发 AAR 文件。
仓库类型
仓库有三种类型
- 免费在线仓库(如 Maven Central)允许任何人上传和下载库。
- 私有仓库(通过登录访问)允许受控分发私有库。
- 本地、基于文件夹的仓库允许通过手动下载分发库。
使用本地、基于文件夹的仓库与向用户提供 AAR 的手动下载链接或通过电子邮件发送 AAR 非常相似。主要区别在于,您不仅发送 AAR,还发送有关身份、版本和依赖项的额外信息。
您分发一个包含您的 AAR 和元数据的基于文件夹的仓库的 zip 文件。然后,您的用户可以解压文件内容,将其添加到他们的项目中,并将其指向 Gradle。从那时起,用户可以使用 Maven 坐标声明对库的依赖,就像库位于在线仓库中一样,并受益于前面提到的所有优点。
创建发布
使用 Gradle Maven Publish 插件发布。Maven Publish 插件允许您声明发布和仓库,并创建任务以将这些发布发布到仓库。这些发布会使用构建驱动插件(可能是 AGP 或 java-library
插件)创建的 SoftwareComponent
实例。
请注意,当使用 AGP 运行 Maven Publish 插件时,软件组件不会在应用插件时直接创建。它们而是在 afterEvaluate()
回调步骤中创建。因此,选择软件组件的发布也必须在 afterEvaluate()
步骤中配置。
以下模块级 build.gradle
文件代码片段为使用 singleVariant()
或 multipleVariants()
创建的给定变体创建了一个发布。
Groovy
publishing { publications { release(MavenPublication) { groupId = 'com.my-company' artifactId = 'my-library' version = '1.0' afterEvaluate { from components.release } } } }
Kotlin
publishing { publications { register<MavenPublication>("release") { groupId = "com.my-company" artifactId = "my-library" version = "1.0" afterEvaluate { from(components["release"]) } } } }
在前面的示例中,组件名称(components.release
)基于赋予 singleVariant()
或 multipleVariants()
的名称。
声明发布后,您必须创建一个目标仓库。
发布到本地仓库
发布到本地仓库与发布到远程仓库非常相似,只是仓库声明不同。阅读上一节,了解如何发布到远程仓库以创建发布所需变体或多个变体的发布。然后创建本地仓库。
Groovy
publishing { publications { release(MavenPublication) { ... } } repositories { maven { name = 'myrepo' url = layout.buildDirectory.dir("repo") } } }
Kotlin
publishing { publications { register<MavenPublication>("release") { ... } } repositories { maven { name = "myrepo" url = uri(layout.buildDirectory.dir("repo")) } } }
这将创建一个名为 publishReleaseToMyRepoRepository
的任务,该任务由发布名称和仓库名称组成。运行此任务可将仓库生成到提供的位置。在此示例中,仓库在项目的 `build` 文件夹下的 repo
目录中生成。
如果您想自动生成仓库的 zip 文件,请使用以下代码:
Groovy
tasks.register('generateRepo', Zip) { def publishTask = tasks.named('publishReleasePublicationToMyrepoRepository') from publishTask.map { it.getRepository().getUrl() } into 'mylibrary' archiveFileName.set('mylibrary.zip') }
Kotlin
tasks.register<Zip>("generateRepo") { val publishTask = tasks.named( "publishReleasePublicationToMyrepoRepository", PublishToMavenRepository::class.java) from(publishTask.map { it.repository.url }) into("mylibrary") archiveFileName.set("mylibrary.zip") }
此代码创建了一个名为 generateRepo
的 Zip
任务,该任务使用发布任务的内容并进行压缩,同时确保 zip 条目位于名为 mylibrary
的顶级文件夹中。输出位于 build/distributions
下。