要授予对您的库的访问权限,您需要选择一个存储库。此页面将指导您完成选择存储库类型相关的注意事项,并展示如何使用 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 插件允许您声明发布和存储库,并创建将这些发布发布到存储库的任务。这些发布使用构建驱动插件创建的SoftwareComponent
实例,该插件可能是 AGP 或java-library
插件。
请注意,当使用 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
的任务,该任务由发布的名称和存储库的名称组成。运行此任务以将存储库生成到提供的路径。在此示例中,存储库在项目的构建文件夹中生成,位于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
下。