Gradle 7.2 如何正确应用自定义Gradle Settings插件?
Gradle Settings 插件实现与应用问题解答
应用方式问题
你当前的应用方式不符合Gradle执行逻辑,存在执行时机错误:
Gradle 解析 settings.gradle.kts 的固定顺序为:优先执行 pluginManagement 配置块,再执行settings顶层配置、应用声明的Settings插件。你在pluginManagement块中直接尝试获取插件创建的扩展,此时插件尚未被应用,扩展还未初始化,运行时会直接抛出「扩展类型不存在」的异常。
正确的应用方式如下:
// settings.gradle.kts pluginManagement { // 只负责声明插件版本、坐标,以及插件本身的下载仓库 plugins { id("com.abitofhelp.gradle.plugins.repositoriesplugin") version "1.0.0-1" } } // 顶层plugins块应用Settings插件 plugins { id("com.abitofhelp.gradle.plugins.repositoriesplugin") } // 插件应用完成后,配置扩展参数 repositoriesPlugin { localRepoName = "local-repo" localRepositoryPath = "../../local-repo" }
实现逻辑问题
你实现Plugin<Settings>接口的写法完全符合官方对Settings类型插件的定义,核心逻辑方向正确,仅存在3个可优化的细节问题:
- 扩展属性读取时机错误:你在
apply方法中直接读取扩展属性,此时用户还未完成扩展配置,读取到的永远是默认值,后续用户的配置不会生效。需要将仓库配置逻辑放到Settings的生命周期回调中,等用户配置完成后再执行。 - 默认值笔误:
localRepositoryName的默认值写为了路径格式../../localRepo,不符合仓库名称的命名规范。 - 路径解析风险:直接使用
URI.create处理相对路径可能出现解析错误,建议用Settings自带的uri()方法处理,相对路径会自动基于settings文件所在目录解析。
修正后的插件代码如下:
// 扩展定义,使用Gradle官方推荐的Property实现懒加载,兼容性更好 interface RepositoriesPluginExtension { val localRepoName: Property<String> val localRepositoryPath: Property<String> } open class RepositoriesPlugin: Plugin<Settings> { override fun apply(settings: Settings) { // 创建扩展,Gradle会自动生成Property的实现类 val extension = settings.extensions.create<RepositoriesPluginExtension>("repositoriesPlugin") // 给属性设置默认值 extension.localRepoName.convention("local-repo") extension.localRepositoryPath.convention("../../local-repo") // 等settings配置全部完成后再执行仓库配置,此时扩展已经被用户配置完成 settings.gradle.settingsEvaluated { val localRepoName = extension.localRepoName.get() val localRepoPath = settings.uri(extension.localRepositoryPath.get()) // 配置全局插件仓库 settings.pluginManagement.repositories { maven { name = localRepoName url = localRepoPath } gradlePluginPortal() mavenCentral() } // 配置全局依赖仓库 settings.dependencyResolutionManagement.repositories { maven { name = localRepoName url = localRepoPath } mavenCentral() gradlePluginPortal() } } } }
内容的提问来源于stack exchange,提问作者A Bit of Help
相关产品推荐
相关产品推荐

