为何引用自定义Gradle配置时需要使用方括号语法?
原因说明
Gradle Kotlin DSL 支持直接写 implementation("xxx")、configurations.implementation.get() 这类简洁调用,本质是靠编译期自动生成的类型安全访问器,不是配置天生自带这种访问能力:
implementation、api这类内置配置,是Java、Kotlin JVM等官方插件在插件加载阶段就提前注册好的。Kotlin DSL在编译你的构建脚本前,会先扫描所有已应用插件注册的配置、任务、扩展,自动生成对应名字的扩展属性和扩展函数,所以你可以直接通过名字调用,不需要手动按字符串查找。- 你在构建脚本里通过
configurations.create("downloadDeps")声明的自定义配置,是在构建脚本运行阶段才被动态创建的。Kotlin DSL编译脚本的时候根本感知不到这个配置的存在,自然不会生成对应的访问扩展,直接写downloadDeps(...)或者configurations.downloadDeps就会抛出未解析引用的错误。
优化方案
如果想给自定义配置用上类型安全访问器,不需要每次写configurations["xxx"],可以选下面两种方案:
- 把自定义配置、自定义任务的注册逻辑抽到
buildSrc或者独立的约定插件中,让这些元素在构建脚本编译前就完成注册,Kotlin DSL扫描到后会自动生成对应访问器。注意你当前代码里自定义配置和Copy任务重名,都叫downloadDeps,就算生成了访问器也会出现符号冲突,建议把任务名改成downloadDepsToLib这类不重名的标识。 - 如果不想额外抽逻辑,保持现在用字符串键查找配置的写法就可以,这是动态注册配置的标准访问方式,功能完全正常,只是少了IDE自动补全和编译期类型检查而已。
你当前贴的可运行代码逻辑本身没有问题,只是不符合Kotlin DSL访问器的生成规则,才会出现直接调用报错的情况。
内容的提问来源于stack exchange,提问作者Marko Galesic
相关产品推荐
相关产品推荐

