如何在单一位置定义Gradle仓库函数并全局复用(含buildSrc)
如何在多项目Gradle构建中复用自定义仓库配置函数?
问题背景
我有一个可替代mavenCentral的自定义函数myCustomRepository,用于创建ArtifactRepository:
fun RepositoryHandler.myCustomRepository(): ArtifactRepository { // 约20行配置代码 }
在包含buildSrc的多项目Gradle构建中,需要将该函数用于:
- 依赖加载与插件加载场景
- 根项目、所有子项目及
buildSrc中
目前的实现方式是在settings.gradle.kts和buildSrc/settings.gradle.kts的四个位置重复定义该函数,导致出现四份完全相同的代码,希望找到仅定义一次就能在四个位置复用的方法。
当前重复代码示例:
settings.gradle.kts
fun RepositoryHandler.myCustomRepository(): ArtifactRepository { // 副本#1 } pluginManagement { fun RepositoryHandler.myCustomRepository(): ArtifactRepository { // 副本#2 } repositories { myCustomRepository() gradlePluginPortal() } } dependencyResolutionManagement { repositories { myCustomRepository() } }
buildSrc/settings.gradle.kts
fun RepositoryHandler.myCustomRepository(): ArtifactRepository { // 副本#3 } pluginManagement { fun RepositoryHandler.myCustomRepository(): ArtifactRepository { // 副本#4 } repositories { myCustomRepository() gradlePluginPortal() } } dependencyResolutionManagement { repositories { myCustomRepository() gradlePluginPortal() } }
解决方案:使用预编译脚本插件
通过预编译脚本插件可以实现函数的单一定义,在所有需要的位置复用。具体步骤如下:
1. 创建预编译脚本插件文件
在buildSrc/src/main/kotlin目录下创建repositories.gradle.kts文件,将自定义函数的实现放在这里:
import org.gradle.api.artifacts.dsl.RepositoryHandler import org.gradle.api.artifacts.repositories.ArtifactRepository fun RepositoryHandler.myCustomRepository(): ArtifactRepository { // 这里放你的完整实现代码,例如: return maven { url = uri("https://your-custom-repository-url.com") // 可选:添加认证、内容过滤等配置 credentials { username = System.getenv("REPO_USER") password = System.getenv("REPO_PASS") } } }
2. 在根项目settings中应用插件
修改根目录下的settings.gradle.kts,移除重复的函数定义,直接应用预编译脚本插件:
// 应用预编译脚本插件 apply(from = "${rootDir}/buildSrc/src/main/kotlin/repositories.gradle.kts") pluginManagement { repositories { myCustomRepository() gradlePluginPortal() } } dependencyResolutionManagement { repositories { myCustomRepository() } }
3. 在buildSrc的settings中应用插件
修改buildSrc/settings.gradle.kts,同样移除重复定义,通过相对路径引用预编译脚本插件:
// 相对路径引用根目录下的预编译脚本插件 apply(from = "../buildSrc/src/main/kotlin/repositories.gradle.kts") pluginManagement { repositories { myCustomRepository() gradlePluginPortal() } } dependencyResolutionManagement { repositories { myCustomRepository() gradlePluginPortal() } }
原理说明
预编译脚本插件会被Gradle编译为字节码,能够在settings脚本中被正确加载和执行。通过将函数定义集中在预编译脚本中,无论是根项目的settings还是buildSrc的settings,都可以通过apply(from = ...)引用该脚本,从而实现函数的复用,彻底消除重复代码。
内容的提问来源于stack exchange,提问作者Laurence Gonsalves
相关产品推荐
相关产品推荐

