如何在构建过程中正确生成XML资源文件?

MrH*_*rio 3 groovy android code-generation build gradle

我需要@raw/filename在构建过程中生成原始XML文件(通过可访问的“原始”文件)。

我一直在尝试使用挂钩的自定义Gradle任务来完成此任务preBuild。然后,此任务将收集所需的所有要求并在下生成文件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)
Run Code Online (Sandbox Code Playgroud)

我在这里想念什么吗?

MrH*_*rio 5

好的,因此,在阅读了有关此问题的更多信息之后,我发现我们确实不能依靠现有文件夹(位于generated或中intermediates)将生成的文件放入其中,因为它们可能被其他任务覆盖和/或根本无法读取。

解决方案?为什么,只创建我们自己的文件夹!例如,这是我最终使用的内容:

def generatedResDir = new File("$buildDir/generated/local/main/res")
Run Code Online (Sandbox Code Playgroud)

然后,将其用作每个生成的资源文件的基本目录。如果您像我一样,并且希望生成rawXML,请执行以下操作:

def targetDir = new File("$generatedResDir/raw")
def target = new File(targetDir, "changelog_latest.xml")
Run Code Online (Sandbox Code Playgroud)

最后但并非最不重要的一点是,generatedResDir通过这样做将其添加为源目录:

sourceSets {
    main {
        res {
            srcDirs += generatedResDir
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,您应该可以毫无问题地生成您选择的任何文件。