移动内置的gradle任务可以完成最后/内置任务shourtcuts

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

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

问题是通过以下方式配置的任务具有配置范围,即在whenReady之前,因此它无法访问’dummy’变量:

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()
  }
}

是否有可能

>在除了whenReady之外的其他地方检测/设置一些构建属性
>将同步任务工作移至doLast
>或者至少有一些同步任务的快捷方式(.execute()看起来很难看)

最佳答案 1)whenReady事件允许用户访问完全初始化的任务图:完成所有初始化并准备好运行任务.当您需要在此处检测/设置构建属性时,唯一的情况是需要内省当前构建设置.

如果您不需要此信息,可以将初始化放在构建脚本中的任何位置.最后,它只不过是时髦的剧本.

    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)如前所述,缺少同步任务快捷方式不应该那么痛苦

点赞