我需要在构建过程中生成原始XML文件(通过@raw/filename
可访问的“原始”)。
我一直在尝试使用preBuild
上挂钩的自定义Gradle任务来完成此操作。然后,此任务将收集所需的所有要求,并在build/intermediates/res/main/raw
下生成文件。
我已尝试将目标目录更改为build/generated/source/res/main/raw
,但问题仍然存在。
将其更改为src/main/res/raw
但是我必须从git中排除生成的文件 - 我不希望这样。此外,将生成的源文件与其编写的对应文件驻留在同一目录中似乎很奇怪。
以下是我的自定义任务的简化代码段:
task(generateChangelogXml) {
def source = new File(rootProject.projectDir, "CHANGELOG")
def targetDir = new File(projectDir, "/build/intermediates/res/main/raw")
def target = new File(targetDir, "changelog_latest.xml")
def versionName = ""
def releaseDate = ""
def changes = new ArrayList<String>()
def reader = new BufferedReader(new FileReader(source))
def currLine = ""
while ((currLine = reader.readLine()) != null) {
// Truncated for brevity
}
target.withWriter { writer ->
writer.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n")
writer.write("<changelog bulletedList=\"true\">\n")
writer.write(" <changelogversion changeDate=\"\" versionName=\"$versionName\">\n")
changes.forEach { change ->
writer.write(" <changelogtext>$change</changelogtext>\n")
}
writer.write(" </changelogversion>\n")
writer.write("</changelog>\n")
}
}
preBuild.dependsOn(generateChangelogXml)
我在这里错过了什么吗?
答案 0 :(得分:2)
好的,所以在阅读了更多有关此事后,我开始了解到我们真的不能依赖现有文件夹(无论是intermediates
还是def generatedResDir = new File("$buildDir/generated/local/main/res")
)来生成我们生成的文件可能会被其他任务覆盖和/或根本不可读。
解决方案?为什么,只需创建我们自己的文件夹!举个例子,这就是我最终使用的内容:
raw
然后,只需将其用作每个生成的资源文件的基本目录。如果您像我一样并且希望生成def targetDir = new File("$generatedResDir/raw")
def target = new File(targetDir, "changelog_latest.xml")
XML,请执行以下操作:
generatedResDir
最后但并非最不重要的是,通过这样做来添加sourceSets {
main {
res {
srcDirs += generatedResDir
}
}
}
作为源目录:
{{1}}
您现在应该能够毫无问题地生成您选择的任何文件。