2011-01-07 61 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