You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在单一位置定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 21:22:19