4

我想创建一个简单的同步任务,根据构建类型(例如调试/发布)稍微改变它的行为,我使用在 gradle.taskGraph.whenReady 中声明的布尔变量“dummy”:

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() 看起来很丑)
4

1 回答 1

2

1)whenReady事件允许用户访问完全初始化的任务图:所有初始化已完成,任务已准备好运行。当您需要在此处检测/设置构建属性时,唯一的情况是您需要自省当前的构建设置。如果您不需要此信息,您可以将初始化放在构建脚本中的任何位置。最后,它不过是 groovy 脚本。

    应用插件:'java'
    现在定义 = 新日期()
    编译Java.doFirst {
      println "现在是 ${now}。我们开始编译"
    }

2) 您不能将同步任务工作移至 doLast。但是您始终可以将您的操作添加到 doFirst ;) 我认为,这应该有效:

任务copySkins(类型:同步){
  来自 skinsFrom
  进入皮肤进入
  重命名皮肤重命名
  排除 symbianExclude

  先做{
    if (!dummy) 排除 dummyExclude
  }
}

3) 如前所述,丢失同步任务快捷方式不应该那么痛苦

于 2011-01-14T17:05:55.890 回答