从任务内部调用Gradle调用任务

时间:2013-12-24 07:53:38

标签: groovy gradle

我正在将一些用于iOS和OSX的Ant构建转换为Gradle。创建了以下内容:

class XcodeBuildTask extends DefaultTask {


    @TaskAction
    def build() {

        def moduleName = 'Typhoon' as String

        def commandLine = """
        #!/bin/sh
        xcodebuild -workspace ${moduleName}.xcworkspace test -scheme Typhoon-iOS -configuration Debug | xcpretty -c -t junit
        """

        def xcodeBuildOutput = new ByteArrayOutputStream();
        def consoleInput = new ByteArrayInputStream()

        exec {
            executable 'bash'
            standardInput = new ByteArrayInputStream(commandLine.getBytes());
            standardOutput = xcodeBuildOutput
        }

    }
}

假设创建一个bash脚本并将其传递给exec任务。但是,运行它我得到错误:

xecution for task':xcodebuild'。

  

没有方法签名:static org.gradle.api.Project.exec()适用于参数类型:(XcodeBuildTask $ _build_closure1)值:[XcodeBuildTask $ _build_closure1 @ 7bbe7fb2]     可能的解决方案:every(),grep(),each(groovy.lang.Closure),grep(java.lang.Object),use([Ljava.lang.Object;),every(groovy.lang.Closure)

这可能是如此基本,但我做错了什么?如何从我的自定义类中调用exec任务?

1 个答案:

答案 0 :(得分:3)

您要在此处尝试从您的任务中调用Project#exec 方法。 (无法调用任务。)与构建脚本不同,类没有隐式project上下文。因此,它必须是project.exec而不是exec

考虑另一种方法,例如:

@TaskAction
def build() {

    Process proc = 'bash'.execute();

    def writer = new PrintWriter(new BufferedOutputStream(proc.out));
    writer.print(xcBashScript());
    writer.close();

    proc.consumeProcessOutput(System.out, System.err);
    proc.waitFor();
    proc.exitValue()


}

private String xcBashScript() {
    $/
    #!/bin/sh
    xcodebuild -workspace ${workspace}.xcworkspace test -scheme ${schemeName} -configuration Debug \
    CONFIGURATION_TEMP_DIR='${intermediatesDir}' -destination OS=${sdkVersion},name=iPad | xcpretty \
    /$
}