Gradle任务替换.java文件中的字符串
我想在编译代码之前替换Config.java文件中的几行。我所能找到的只是在复制过程中通过过滤器解析文件。一旦我必须复制它,我就必须将它保存在某个地方——这就是为什么我选择了解决方案:在替换行时复制到临时位置>删除原始文件>将复制的文件复制回原始位置>删除临时文件。有更好的解决方案吗?也许你应该试试蚂蚁的:Gradle任务替换.java文件中的字符串,java,gradle,task,Java,Gradle,Task,我想在编译代码之前替换Config.java文件中的几行。我所能找到的只是在复制过程中通过过滤器解析文件。一旦我必须复制它,我就必须将它保存在某个地方——这就是为什么我选择了解决方案:在替换行时复制到临时位置>删除原始文件>将复制的文件复制回原始位置>删除临时文件。有更好的解决方案吗?也许你应该试试蚂蚁的: 任务myCopy 我绝对不会覆盖原始文件 我喜欢基于目录而不是基于文件名,所以如果是我,我会将Config.java放在它自己的文件夹中(例如src/replaceme/java) 我将在$
任务myCopy
我绝对不会覆盖原始文件
我喜欢基于目录而不是基于文件名,所以如果是我,我会将Config.java放在它自己的文件夹中(例如src/replaceme/java
)
我将在$buildDir
下创建一个生成的src
目录,以便通过clean
任务将其删除
您可以使用复制任务和替换令牌筛选器。例如:
apply plugin: 'java'
task generateSources(type: Copy) {
from 'src/replaceme/java'
into "$buildDir/generated-src"
filter(ReplaceTokens, tokens: [
'xxx': 'aaa',
'yyy': 'bbb'
])
}
// the following lines are important to wire the task in with the compileJava task
compileJava.source "$buildDir/generated-src"
compileJava.dependsOn generateSources
为了补充lance java
的答案,我发现如果您只希望更改一个值,那么这个习惯用法更简单:
task generateSources(type: Copy) {
from 'src/replaceme/java'
into "$buildDir/generated-src"
filter { line -> line.replaceAll('xxx', 'aaa') }
}
警告:请记住,
复制
任务仅在源文件更改时运行。如果您希望根据其他条件进行替换,则需要使用Gradle的增量构建功能来指定该情况。我已经使用了替换方法,并且它的工作方式完美无缺,但一旦手动编辑Config.java文件,可能会达到一些不需要的状态,因此您的解决方案似乎更好。compileJava.source=[files]到底做什么?它如何知道我是否要替换包'com.example.cfg'中的Config.java,而不是包'com.example.remote.cfg'中同名的文件?正如我所说,我更喜欢使用目录而不是特定的文件名模式。因此,在我的示例中,src/replaceme/java
中的所有内容都将被替换,而与包无关compileJava.source generateSources.outputs.files
调用,最终添加生成的源代码,以便它们与普通源文件一起编译(在src/main/java
中)。我的建议中没有“=”符号。请看另一个提示:小心,我们被烧死了。我们使用-Pversion={version}运行,但该目标一直说源文件不脏,因此我们的新版本从未放入该文件中。它适用于许多事情,但不适用于版本控制。“我们发现了那里的艰难道路。”迪安希尔谢谢你的评论。我不是100%肯定我理解你的意思。你是说你的源文件没有更改,因此Gradle没有按照你想要的方式“更改”它们,即使它应该更改其中的“版本”?我们尝试使用该方法进行版本更改,但如果源文件没有更改,它实际上根本不会运行,并且会进行0替换,因此,当从开发版本切换到发布版本时,我们的输出文件中会出现“要替换的版本令牌”。现在还不确定最好的方法是什么…也许只是归档。我明白了。实际上,复制任务仅在源文件更改时运行。这是它的默认行为。在您的情况下,您应该考虑是什么触发因素导致了这种更换。你想让它在Gradle每次运行时都运行吗?还有其他情况吗?一旦你明白了这一点,你应该使用Gradle的增量构建功能来指定它:例如指定任务的输入、输出或updateToDateWhen。我将在我的答案中添加这个警告。请随意在其他答案上发表同样的评论,他们都关心这个角落的案子
task generateSources(type: Copy) {
from 'src/replaceme/java'
into "$buildDir/generated-src"
filter { line -> line.replaceAll('xxx', 'aaa') }
}