Gradle中configureEach的适用场景:两种KotlinCompile配置写法对比
Gradle中两种KotlinCompile配置写法的差异
这两种写法不一致,核心差异在于对动态创建任务的处理逻辑,以下是详细说明:
1. 写法差异解析
第一种写法:tasks.withType<KotlinCompile> { ... }
这种是一次性配置:Gradle执行这段代码时,会立即对当前已存在的所有KotlinCompile类型任务应用配置。如果后续有新的KotlinCompile任务被动态创建(比如通过插件、自定义任务注册逻辑生成),这些新任务不会自动继承这段配置。
示例代码:
tasks.withType<KotlinCompile> { kotlinOptions { jvmTarget = "17" } }
第二种写法:tasks.withType<KotlinCompile>().configureEach { ... }
这种是延迟性配置:Gradle不仅会给当前已存在的KotlinCompile任务应用配置,还会注册一个监听器——后续任何新创建的KotlinCompile任务,都会自动触发这段配置逻辑,确保所有同类型任务都能统一应用规则。
示例代码:
tasks.withType<KotlinCompile>().configureEach { kotlinOptions { jvmTarget = "17" } }
2. 适用场景选择
- 选第一种写法:如果能确定所有
KotlinCompile任务在执行这段配置代码时已经全部创建完成,不会有动态新增的情况(比如简单单模块项目,无复杂插件或动态任务注册逻辑),可以用这种写法,执行效率略高。 - 选第二种写法:如果项目存在动态创建
KotlinCompile任务的场景(比如多模块项目中通过插件动态生成子模块编译任务、自定义任务注册逻辑),必须用这种写法,才能确保所有编译任务都能统一应用配置。
内容的提问来源于stack exchange,提问作者k314159
相关产品推荐
相关产品推荐

