2016-08-16 42 views
0

我一直在爲此掙扎一天半左右。我試圖複製在搖籃以下螞蟻概念:什麼是Gradle中Ant taskdef的等價物?

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

其中runexe被其他地方

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

聲明,也可能是一個taskdefscriptdef即我希望能夠調用一個可重用的預定義代碼塊,並從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. 

    ... 
} 

並使用dependsOn讓它運行。但是,這不允許我在需要時正好運行runexe。我已經用executableargscommandLine進行了廣泛的實驗。我玩過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" 
     } 
    } 
}