【发布时间】:2012-02-20 13:32:03
【问题描述】:
作为 Gradle 中部署任务的一部分,我想将 foo.properties 中的属性值更改为指向生产数据库而不是开发数据库。
我不想直接替换整个文件,因为它相当大,这意味着我们必须维护两个仅在一行上不同的单独版本。
最好的方法是什么?
【问题讨论】:
标签: gradle
作为 Gradle 中部署任务的一部分,我想将 foo.properties 中的属性值更改为指向生产数据库而不是开发数据库。
我不想直接替换整个文件,因为它相当大,这意味着我们必须维护两个仅在一行上不同的单独版本。
最好的方法是什么?
【问题讨论】:
标签: gradle
您可以使用 ant.propertyfile 任务:
ant.propertyfile(
file: "myfile.properties") {
entry( key: "propertyName", value: "propertyValue")
entry( key: "anotherProperty", operation: "del")
}
【讨论】:
你应该能够启动一个蚂蚁“替换”任务来做你想做的事:http://ant.apache.org/manual/Tasks/replace.html
ant.replace(file: "blah", token: "wibble", value: "flibble")
【讨论】:
创建一个属性对象,然后使用目标属性文件路径创建文件对象,使用 load 将文件加载到属性对象上,使用 setProperty 设置所需的属性,然后使用 store 保存更改。
def var = new Properties()
File myfile = file("foo.properties");
var.load(myfile.newDataInputStream())
var.setProperty("db", "prod")
var.store(myfile.newWriter(), null)
【讨论】:
一个简单的解决方案是编写一个使用java.util.Properties 写入文件的任务。如果你真的想增量更新文件,你必须自己实现。或者,也许您找到了一个执行您想要的 Ant 任务(所有 Ant 任务都可以从 Gradle 中按原样使用)。为了获得最佳效果,您还应该声明任务的输入和输出,以便 Gradle 仅在需要更改属性文件时执行任务。
【讨论】:
你可以使用ReplaceTokens
假设您在src/main/java/resources/com.stackoverlow 中有一个名为db.properties 的文件(位置无关紧要),内容如下
database.url=@url@
请注意,@ 包围 url 文本是必需的。
然后您可以在 build.gradle 文件中定义它。
processResources {
filter ReplaceTokens, tokens: [
"url": "https://stackoverflow.com"
]
}
当您构建代码时,这会将@url@ 替换为https://stackoverflow.com。
如果您只想将此规则应用于特定文件,可以添加filesMatching
processResources {
filesMatching('**/db.properties') {
filter ReplaceTokens, tokens: [
"url": "https://stackoverflow.com"
]
}
}
更多解释请见gradle doc
【讨论】: