如何在构建期间正确生成 XML 资源文件?
How to correctly generate an XML resource file during build?
我需要在构建过程中生成原始 XML 文件("raw" 可通过 @raw/filename
访问)。
我一直在尝试使用挂接到 preBuild
的自定义 Gradle 任务来完成此操作。然后此任务将收集所有需要的需求并在 build/intermediates/res/main/raw
.
下生成文件
到目前为止一切都很好;我可以看到文件已正确生成。但是,我似乎无法从我拥有的任何其他 XML 资源文件访问它。
我尝试将目标目录更改为 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)
我是不是漏掉了什么?
好的,所以在阅读了更多有关此事的信息后,我开始了解到我们真的不能依赖现有文件夹(在 generated
或 intermediates
中)将我们生成的文件放入因为它们可能会被其他任务覆盖 and/or 根本不可读。
解决办法?为什么,只要创建一个我们自己的文件夹!例如,这就是我最终使用的:
def generatedResDir = new File("$buildDir/generated/local/main/res")
然后,将其作为每个生成的资源文件的基目录即可。如果您像我一样想要生成 raw
XML,那么请执行以下操作:
def targetDir = new File("$generatedResDir/raw")
def target = new File(targetDir, "changelog_latest.xml")
最后但同样重要的是,通过这样做将 generatedResDir
添加为源目录:
sourceSets {
main {
res {
srcDirs += generatedResDir
}
}
}
您现在应该可以毫无问题地生成您选择的任何文件。
我需要在构建过程中生成原始 XML 文件("raw" 可通过 @raw/filename
访问)。
我一直在尝试使用挂接到 preBuild
的自定义 Gradle 任务来完成此操作。然后此任务将收集所有需要的需求并在 build/intermediates/res/main/raw
.
到目前为止一切都很好;我可以看到文件已正确生成。但是,我似乎无法从我拥有的任何其他 XML 资源文件访问它。
我尝试将目标目录更改为 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)
我是不是漏掉了什么?
好的,所以在阅读了更多有关此事的信息后,我开始了解到我们真的不能依赖现有文件夹(在 generated
或 intermediates
中)将我们生成的文件放入因为它们可能会被其他任务覆盖 and/or 根本不可读。
解决办法?为什么,只要创建一个我们自己的文件夹!例如,这就是我最终使用的:
def generatedResDir = new File("$buildDir/generated/local/main/res")
然后,将其作为每个生成的资源文件的基目录即可。如果您像我一样想要生成 raw
XML,那么请执行以下操作:
def targetDir = new File("$generatedResDir/raw")
def target = new File(targetDir, "changelog_latest.xml")
最后但同样重要的是,通过这样做将 generatedResDir
添加为源目录:
sourceSets {
main {
res {
srcDirs += generatedResDir
}
}
}
您现在应该可以毫无问题地生成您选择的任何文件。