要授予对你的库的访问权限,你需要选择一个资源库。此页面将指导你了解选择资源库类型相关的注意事项,并展示如何使用 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
的任务,该任务包含发布的名称和存储库的名称。运行此任务可将存储库生成到提供的地址。在此示例中,存储库是在项目的构建文件夹中,在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
下。