在分机

时间:2016-10-27 22:44:42

标签: gradle groovy libgdx

我正在实施LibGDX's TexturePacker with gradle中提供的texturePacker任务。

project.ext {
    // ...
    texturePacker = ["assets", "../android/assets", "texture"]
}

import com.badlogic.gdx.tools.texturepacker.TexturePacker
task texturePacker << {
    if (project.ext.has('texturePacker')) {
        logger.info "Calling TexturePacker: "+ texturePacker
        TexturePacker.process(texturePacker[0], texturePacker[1], texturePacker[2])
    }
}

我使用了对类路径的建议修改并添加了扩展变量。现在我想将textPacker扩展变量修改为闭包(这是正确的术语吗?),使用描述性成员名称而不是数组。我试过这样做:

project.ext {
    // ...
    texturePacker {
        inputDir = "assets"
        outputDir = "../android/assets"
        packFileName = "texture"
    }
}

这会出现以下错误:

  

错误:无法在项目&#39;:desktop&#39;上找到参数[build_4dusyb6n0t7j9dfuws8cc2jlu $ _run_closure1 $ _closure7 @ 6305684e]的方法texturePacker()类型为org.gradle.api.Project。

我对gradle和groovy很新,所以我不知道这个错误意味着什么。更重要的是,做我想做的事的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

我想,闭包不是你需要的东西,因为它不是用来存储变量,而是用来存储一些可执行的代码。顺便说一句,如果需要存储它,您必须添加=,如下所示:

project.ext {
    texturePacker = {
        inputDir = "assets"
        outputDir = "../android/assets"
        packFileName = "texture"
    }
}

无论如何,如果需要在texturePacker变量中存储变量,则必须使用Map类型,然后使用Closure。这可以这样做:

project.ext {
    texturePacker = [
        inputDir : "assets",
        outputDir : "../android/assets",
        packFileName : "texture"
    ]
}

然后您只能通过名称访问此变量,如:

println texturePacker.inputDir

答案 1 :(得分:1)

或者,我认为您也可以使用这些属性来实现自己的任务。您可以使用DefaultTask,它是常规任务的标准实现(我相信对您来说已经足够了);

class TexturePacker extends DefaultTask {
     String inputDir; // a property - not a field!
     String outputDir; // a property - not a field!
     ...

     @TaskAction
     void doSth(){
        // do sth with properties above - that will be called automatically by gradle as a task-execution
     }
}

task packer (type:TexturePacker) {
     inputDir '<your-input-dir>'
     outputDir '<your-output-dir>'
}

语法可能不是非常正确,但是我想您会明白的。