我有一个简单的Gradle构建脚本来编译和打包(类似于应用程序插件)我的Java应用程序。我唯一没有做的就是在一个简单的.properties文件中替换当前的版本号。
我创建了一个文件' src / main / resources / app-info.properties'单行' application.version = @version @'。不,只要将文件复制到构建文件夹,我想替换此版本字符串(认为这在构建任务期间发生)。
我已经尝试过使用蚂蚁ReplaceTokens的简单解决方案。这个替换了版本,但也破坏了资源中的.png文件..
有没有一个简单的解决方案,只需在构建任务期间在一个文件中替换令牌(或任何处理复制到构建文件夹的任务)?
感谢您的帮助! 本
======根据Opal的评论进行编辑=====
根据提示,我添加了以下内容:
import org.apache.tools.ant.filters.ReplaceTokens
// ...
build {
from('src/main/resources') {
include '*.properties'
filter(ReplaceTokens, tokens: [version : project.version])
}
}
这引发了这个错误:
无法在根项目中找到来自()的方法[src / main / resources,build_vbjud9ah7v3pj5e7c5bkm490b $ _run_closure6_closure12 @ 43ead1a8]
好像我做错了什么?
======编辑完整性添加基于Opals建议的解决方案=====
谢谢你,以下是工作解决方案!
processResources {
from('src/main/resources') {
include '*.properties'
filter(ReplaceTokens, tokens: [version : project.version])
}
}
答案 0 :(得分:8)
书籍和博客等,包括Opal的答案都建议使用exclude/include
,from()
和filter()
的生动混合。当然,我第一次尝试将{{app javascript library}}
文件中的文本index.html
替换为依赖于简单项目属性设置的JavaScript库的路径时也是如此。
让我感到困扰的是我的战争'任务在war存档中生成了重复的index.html文件并使用前面描述的模式摆脱了问题,导致了一个巨大的不可读的黑客攻击。
然后我找到了一个非常直接的解决方案。以下示例来自我自己的构建脚本,您必须对其进行自定义以满足您的需求:
war {
eachFile { copyDetails ->
if (copyDetails.path == 'index.html') {
filter { line ->
line.replace('{{app javascript library}}', "lib/someLib.js")
}
}
}
}
答案 1 :(得分:3)
粘贴示例代码。您需要做的是包含文件以进行替换,排除替换其他文件。 Here是示例用法。搜索 ReplaceTokens ,你会看到我在说什么。
您需要向processResources
任务添加过滤功能。示例代码:
processResources {
def profile = project.properties['profile']
def replace_tokens = profile ? filter_tokens[profile] : filter_tokens['default']
exclude '**/log4j-test.xml'
from('src/main/resources') {
exclude '**/*.ttf'
filter(ReplaceTokens, tokens: replace_tokens)
}
from('src/main/resources') {
include '**/*.ttf'
}
}
以上ttf
(二进制)文件从过滤中排除但已复制。 replace_tokens
是从脚本其他部分中定义的地图中获取的过滤器。