Gradle任务写文件出现问题

3
我正在开发一款Android应用程序,其中包含一个JSON文件目录。我想创建一个Gradle任务,将所有这些文件合并成单个JSON文件。以下是我目前拥有的Gradle任务,但它不会创建该文件:
// Task that combines all JSON files in ../libraries into src/main/res/raw/libraries.json
task combineJSonFiles {
    String content = ""
    FileTree tree = fileTree(dir: '../libraries', include: '**/*.json')
    tree.each {File file ->
        content += file.getText()
    }

    println "[" + content.substring(0, content.length()-1) + "]" // prints out the correct contents
    File libraries = file("../app/src/main/res/raw/libraries.json")
    println libraries.getProperties()
}

我将打印属性并且不确定这些是属性值的原因:
{directory=false, canonicalFile=/Users/michaelcarrano/AndroidStudioProjects/detective_droid/app/src/main/res/raw/libraries.json, file=false, freeSpace=0, canonicalPath=/Users/michaelcarrano/AndroidStudioProjects/detective_droid/app/src/main/res/raw/libraries.json, usableSpace=0, hidden=false, totalSpace=0, path=/Users/michaelcarrano/AndroidStudioProjects/detective_droid/app/src/main/res/raw/libraries.json, name=libraries.json, prefixLength=1, absolute=true, class=class java.io.File, parentFile=/Users/michaelcarrano/AndroidStudioProjects/detective_droid/app/src/main/res/raw, absolutePath=/Users/michaelcarrano/AndroidStudioProjects/detective_droid/app/src/main/res/raw/libraries.json, absoluteFile=/Users/michaelcarrano/AndroidStudioProjects/detective_droid/app/src/main/res/raw/libraries.json, parent=/Users/michaelcarrano/AndroidStudioProjects/detective_droid/app/src/main/res/raw}

即使阅读了文档,我还是无法理解这个问题,希望能得到帮助。 http://www.gradle.org/docs/current/userguide/working_with_files.html

2个回答

2

我只是发布了现在能够工作的任务代码:

task combineJSonFiles {
    String content = ""
    FileTree tree = fileTree(dir: '../libraries', include: '**/*.json')
    tree.each {File file ->
        content += file.getText()
    }
    def libraries = new File("app/src/main/res/raw/libraries.json")
    libraries.text = "[" + content.substring(0, content.length()-1) + "]"
}

我的问题是尝试使用Java.io.File,但文件的目录路径设置错误。


1
在Groovy/Java中创建java.io.File的实例并不会在磁盘上创建文件。您需要写一些内容到其中。请查看这个tutorial以了解如何在Groovy中处理文件。
此外,您已经将任务实现放在了任务配置块中,而不是任务操作中。这意味着您的代码将不会在您期望的时候运行 - 它将在每次运行gradle时运行,而不是在运行此任务时运行。您需要将您的代码放在doLast块中。

谢谢!我终于让它工作了,但我发誓我已经尝试过这种方法了。至于这个任务,我希望每次运行Gradle时都能运行它,以确保我拥有最新版本的文件。如果您认为有更好的方法来运行任务,请告诉我。 - michaelcarrano
目前该代码作为Gradle配置阶段的一部分运行,并与任务运行无关。 - Perryn Fowler
我建议将您的代码放在 doLast 块中,然后使用 dependsOn 来确保任务在您想要运行它时运行。 - Perryn Fowler
那么,您可能需要考虑声明任务的输入和输出,以便如果没有更改,则不会执行不必要的工作。请查看http://www.gradle.org/docs/2.0/userguide/userguide_single.html#sec:up_to_date_checks。 - Perryn Fowler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接