2011-01-07 23 views
4

我想創建一個簡單的同步任務,根據構建類型(例如debug/release)稍微改變它的行爲,我使用布爾變量'dummy'decrared在gradle.taskGraph.whenReady:移動內置gradle任務工作做最後/內置任務shourtcuts

gradle.taskGraph.whenReady {taskGraph -> 
    dummy = false 
    if (taskGraph.hasTask(':dummybuild')) { 
    dummy = true 
    } 
} 

的問題是通過以下方式進行配置任務配置範圍,whenReady之前即所以它並沒有進入「虛擬」變量:

task copySkins(type: Sync) { 
    from skinsFrom 
    into skinsInto 
    rename skinsRename 
    exclude symbianExclude 
    if (!dummy) exclude dummyExclude 
} 

現在我正在使用此解決方法

task copySkins { 
    inputs.dir skinsFrom 
    outputs.dir skinsInto 

    doLast { 
    task skins(type: Sync) { 
     from skinsFrom 
     into skinsInto 
     rename skinsRename 
     exclude symbianExclude 
     if (!dummy) exclude dummyExclude 
    } 
    skins.execute() 
    } 
} 

是否有可能

  1. 檢測/設置在其他一些地方的一些構建屬性除了whenReady
  2. 移動同步任務工作doLast
  3. 或至少有一定的快捷方式同步任務( .execute()看起來相當醜)

回答

2

1)whenReady事件允許用戶訪問完全初始化任務圖:所有的初始化完成並且任務已準備好運行。唯一的情況是,當您需要檢測/設置構建屬性時,您需要反思當前的構建設置。 如果你不需要這些信息,你可以在你的構建腳本的任何位置放置你的初始化。最後,它只是groovy腳本。

 
    apply plugin: 'java' 
    def now = new Date() 
    compileJava.doFirst { 
     println "It is ${now}. We are starting to compile" 
    } 

2)您不能移動同步任務工作doLast。但是,你可以隨時添加你的行動doFirst;)我想,這應該工作:

 
task copySkins(type: Sync) { 
    from skinsFrom 
    into skinsInto 
    rename skinsRename 
    exclude symbianExclude 

    doFirst { 
    if (!dummy) exclude dummyExclude 
    } 
} 

3)在衆人面前說,失蹤同步任務的快捷方式不應該是不好受

+2

1)似乎gradle這個DAG是完全無用的,甚至不適合配置像sync這樣的內置任務:a)僅當配置階段和同步執行期間調用whenReady時b)這使得不可能的多內部配置像debug + release一樣不可能。我將發佈單獨的問題重新編譯爲gradle-user ML 2)這不起作用 - 任務在配置階段執行,doFirst在「運行」階段執行 – thevery 2011-01-15 12:47:22