如何在Gradle Copy任务的“扩展”部分使用属性文件?

2mbi3lxu  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(125)

假设我有一个属性文件config.properties,其中包含

prop1=abc
prop2=xyz

和一个template-config.xml,看起来像

<bean id="id1" >
  <property name="prop1" value="${prop1}" />
  <property name="prop2" value="${prop2}" />
</bean>

我有两个问题:
1.是否可以使用gradle复制任务的expand()部分中的属性文件将属性从gradle. build. kts注入配置?
1.有没有一种方法可以使用expand只填充其中一个属性而不引发错误?
到目前为止我有

tasks.register<Copy>("create-config-from-template") {
    from("$buildDir/resources/main/template-config.xml")
    into("$buildDir/dist")
    expand(Pair("prop1", "abc"))
}

但是,这会引发错误
Groovy模板扩展缺少属性(prop2)。已定义键[prop1]。
我知道我也可以在"expand()"中指定prop2的值,但就我的目的而言,如果我只能注入一些属性而不注入其他属性,那将有所帮助。有没有一种简单的方法可以告诉gradle不要担心文件中的其他"${}"属性?
如果没有,有没有方法可以使用实际的属性文件作为属性集进行扩展?我似乎在任何地方都找不到Kotlin DSL语法。
先谢谢你了。

zy1mlcev

zy1mlcev1#

对于1,您可以使用configure existing processResources任务将其他配置应用于特定文件。在本例中,template-config.xml为例:

tasks.processResources {
    filesMatching("**/template-config.xml") {
        val examplePropertiesTextResource = resources.text.fromFile(layout.projectDirectory.file("example.properties"))
        val exampleProperties = Properties().apply {
            FileInputStream(examplePropertiesTextResource.asFile()).use { load(it) }
        }
        val examplePropertiesMap = mutableMapOf<String, Any>().apply {
            exampleProperties.forEach { k, v -> put(k.toString(), v) }
        }
        expand(examplePropertiesMap)
    }
}

filesMatching将匹配你想要的文件,然后接下来的行加载属性文件,在本例中是项目根目录下的文件名example.properties,然后将其转换为Map<String, Any>并传递给expand方法。
但是,对于2,如果缺少任何属性,则使用上述方法将失败。这是因为底层扩展引擎(SimpleTemplateEngine)不允许这样的配置
作为一种替代方法,您可以使用Apache ANT中的ExpandTokens来实现某些属性丢失时的替换:

tasks.processResources {
    filesMatching("**/template-config.xml") {
        val examplePropertiesTextResource = resources.text.fromFile(layout.projectDirectory.file("example.properties"))
        val exampleProperties = Properties().apply {
            FileInputStream(examplePropertiesTextResource.asFile()).use { load(it) }
        }
        val examplePropertiesMap = mapOf<String, Any>("tokens" to exampleProperties.toMap())
        println(examplePropertiesMap)
        filter(examplePropertiesMap, ReplaceTokens::class.java)
    }
}

请注意,对于ReplaceTokens,必须将占位符从${example}更改为@example@

<bean id="id1" >
    <property name="prop1" value="@prop1@" />
    <property name="prop2" value="@prop2@" />
</bean>

这是因为Gradle仅接受Class,而ReplaceTokensfinal,因此您无法扩展该类以使用${}作为占位符。

相关问题