作为Gradle中部署任务的一部分,我想将foo.properties
中的属性值更改为指向生产数据库而不是开发数据库。
我宁愿不直接替换整个文件,因为它相当大,这意味着我们必须维护两个不同的版本,这些版本只在一行上有所不同。
实现这一目标的最佳方法是什么?
答案 0 :(得分:32)
您可以使用ant.propertyfile任务:
ant.propertyfile(
file: "myfile.properties") {
entry( key: "propertyName", value: "propertyValue")
entry( key: "anotherProperty", operation: "del")
}
答案 1 :(得分:7)
您应该可以启动执行所需操作的ant“替换”任务:http://ant.apache.org/manual/Tasks/replace.html
ant.replace(file: "blah", token: "wibble", value: "flibble")
答案 2 :(得分:3)
一个简单的解决方案是编写使用java.util.Properties
来编写文件的任务。如果您真的想要逐步更新文件,则必须自己实现。或者您可能会找到一个可以执行您想要的Ant任务(所有Ant任务都可以从Gradle中使用)。为了获得最佳结果,还应声明任务的输入和输出,以便Gradle仅在需要更改属性文件时执行任务。
答案 3 :(得分:2)
创建属性对象,然后使用目标属性文件路径创建文件对象,使用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)
答案 4 :(得分:0)
您可以使用ReplaceTokens
假设您在db.properties
中有一个名为src/main/java/resources/com.stackoverlow
的文件(位置无关紧要),其内容如下:
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