2016-08-16 1 views
0

Я боролся с этим в течение полутора дней или около того. Я пытаюсь повторить следующий Ant концепции в Gradle:Что такое эквивалент Ant taskdef в Gradle?

<target name="test"> 
    ... 
    <runexe name="<filename> params="<params>" /> 
    ... 
</target> 

где runexe объявлен в другом месте, как

<macrodef name="runexe" > 
    ... 
</macrodef> 

и может также быть taskdef или scriptdef то я хотел бы быть в состоянии для вызова повторно используемого заранее заданного блока кода и передачи ему необходимых параметров из задач Gradle. Я много пробовал. Я могу создать задачу, которая запускает exe без каких-либо проблем:

task runexe(type: Exec){ 
    commandLine 'cmd', '/c', 'dir', '/B' 
} 

task test(dependsOn: 'runexe') { 
    runexe { 
     commandLine 'cmd', '/c', 'dir', '/N', 'e:\\utilities\\' 
    } 
} 

test << { 
    println "Testing..." 

    // I want to call runexe here. 

    ... 
} 

и использовать зависит от того, чтобы он работал. Однако это не позволяет мне запускать runexe именно тогда, когда мне нужно. Я интенсивно экспериментировал с executable, args и commandLine. Я играл с exec и пробовал несколько разных вариантов, найденных здесь и вокруг сети. Я также работаю с бесплатными книгами, доступными на сайте Gradle.

Что мне нужно сделать, это прочитать список файлов из каталога и передать каждый файл в приложение с некоторыми другими аргументами. Список файлов не будет известен до времени выполнения, то есть до тех пор, пока скрипт не прочитает их, список может меняться, и вызов необходимо выполнить повторно.

Мой лучший вариант в настоящее время является тем, что я нашел here, что может быть и хорошо, но кажется, что должен быть лучший способ. Я понимаю, что задачи предназначены для вызова один раз и что вы не можете вызвать задачу из другой задачи или передать один параметр, но я очень хотел бы знать, какой правильный подход к этому находится в Gradle. Я надеюсь, что один из дизайнеров Gradle может быть достаточно любезен, чтобы рассказать мне об этом, поскольку этот вопрос часто задается во всем Интернете, и я еще не нашел ясного ответа или решения, которое я могу сделать.

+0

Gradle, по дизайну, чрезвычайно гибкий. Техника, используемая в ссылке, упомянутой в последнем абзаце, выглядит для меня прекрасной. т. е. не все должно быть задачей; определение метода в порядке. –

+0

Спасибо. Я теперь использовал функции, чтобы делать то, что хочу, но мне все равно было бы интересно узнать, есть ли еще способ Gradle-ish. – ConfusedAgain

ответ

0

я в конце концов пошел с this, упомянутый выше. У меня есть exec {}, работающий хорошо в нескольких местах, и это, кажется, лучший вариант для этого варианта использования.

Угодить переусердствовать модератора, это означает, что это:

def doMyThing(String target) { 
    exec { 
     executable "something.sh" 
     args "-t", target 
    } 
} 

, как упоминалось выше. Это обеспечивает ту же самую конечную функциональность.

0

Если ваша задача должна читать имена файлов, я предлагаю использовать предоставленный API вместо выполнения команд. Также использование exec сделает его специфичным для ОС, поэтому не обязательно переносится на разные ОС.

Вот как это сделать:

task hello { 
    doLast { 
     def tree = fileTree(dir: '/tmp/test/txt') 
     def array = [] 
     tree.each { 
      array << it 
      print "${it.getName()} added to array!\n" 
     } 
    } 
}