我正在将一些用于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任务?
答案 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 \
/$
}