如何在Gradle Copy任务的expand中使用属性文件及部分填充属性?
Gradle Copy任务expand()方法的两个问题解答
问题1:能否用config.properties属性文件配合expand()注入配置?
可以。在Gradle Kotlin DSL中,可直接加载属性文件并将其内容转为Map传入expand()方法,实现模板配置注入,代码示例如下:
tasks.register<Copy>("create-config-from-template") { from("$buildDir/resources/main/template-config.xml") into("$buildDir/dist") // 加载项目根目录下的config.properties文件 val configProps = java.util.Properties().apply { file("$projectDir/config.properties").inputStream().use { load(it) } } // 将属性文件内容转为Map,传入expand()完成模板替换 expand(configProps) }
问题2:能否仅填充部分属性且不抛出错误?
默认情况下,expand()依赖Groovy模板引擎,会对未匹配的${xxx}占位符抛出缺失属性错误。可通过以下两种方式解决:
方式一:自定义属性缺失处理逻辑
给expand()传入自定义绑定逻辑,当找不到对应属性时返回原占位符,避免报错:
tasks.register<Copy>("create-config-from-template") { from("$buildDir/resources/main/template-config.xml") into("$buildDir/dist") val providedProps = mapOf("prop1" to "abc") // 自定义属性缺失处理,保留原占位符 expand( mapOf( "propertyMissing" to { name: String -> "\${$name}" } ) + providedProps ) }
方式二:使用Ant的ReplaceTokens过滤器
该方式更灵活,可直接配置未匹配token的处理策略(保留原token):
import org.apache.tools.ant.filters.ReplaceTokens tasks.register<Copy>("create-config-from-template") { from("$buildDir/resources/main/template-config.xml") into("$buildDir/dist") filter(ReplaceTokens::class, mapOf( "tokens" to mapOf("prop1" to "abc"), "missingTokens" to "keep" // 保留未填充的占位符 )) }
内容的提问来源于stack exchange,提问作者G. Tabs
相关产品推荐
相关产品推荐

