В зависимости от того, чего вы хотите достичь, ответ, который вы найдете, вероятно, все еще будет неправильным.
Все задачи имеют два основных этапа: конфигурирование и выполнение. Все, что вы помещаете в самый внешний блок для определения задачи, является частью конфигурации. И метод exec
фактически выполняет команду всякий раз, когда оценивается этот блок кода. Поэтому, когда вы набираете:
task myTask() {
def stdout = new ByteArrayOutputStream()
exec {
commandLine 'cmd', '/c', 'whoami'
standardOutput = stdout;
}
println "Output: $stdout"
}
, это означает, что вы запускаете команду whoami
независимо от того, какую задачу вы указываете. Если вы запустите gradle -i help
, он напечатает имя. Я ожидаю, что это не то, что вы намереваетесь.
В большинстве случаев вы захотите запускать команду только тогда, когда задача действительно выполняется. Поэтому, если вы хотите, чтобы команда запускалась только при вводе gradle -i myTask
, вам нужно будет вместо этого отложить ее до стадии выполнения. Это можно сделать двумя способами.
Либо вы можете поместить все в блок doLast
, например, так:
task myTask() {
doLast {
def stdout = new ByteArrayOutputStream()
exec {
commandLine 'cmd', '/c', 'whoami'
standardOutput = stdout
}
println "Output: $stdout"
}
}
Или использовать тип Exec
, как вы уже пробовали. Причина, по которой он не работает для вас, заключается в том, что вам нужно настроить его с помощью команды, которая вам нравится, а не запустить команду с помощью метода exec
. Это может выглядеть так:
task myTask(type: Exec) {
commandLine 'cmd', '/c', 'whoami'
standardOutput = new ByteArrayOutputStream()
doLast {
println "Output: $standardOutput"
}
}
Вы также, вероятно, избавляетесь от части cmd /c
. И println
следует использовать только для отладки - используйте logger.info
(или .warn
и т. Д.), Если вам нужно что-то вывести пользователю.