任何方式写更简洁的gradle?

时间:2012-10-12 14:22:10

标签: gradle

我还不知道groovy还不错,现在就试着过去。我现在正在使用以下gradle工作,但我想知道是否有更简洁的方法来编写它:

task staging(type: Sync) {
    from(stagingDir) {}
    into toStagingDir
}

task syncJars(type: Sync) {
    from(configurations.compile) {}
    from(fixedLibDir) {}
    into toStagingLibsDir
}

task copyMainJar(type: Copy) {
    from(libsDir) {}
    into toStagingLibsDir
}

task myZip(type: Zip) {
    archiveName "bacnet.zip"
    from(buildDir) {
        include project.name+'/**'
    }
}

syncJars.dependsOn('staging')
copyMainJar.dependsOn('syncJars')
myZip.dependsOn('copyMainJar')
assemble.dependsOn('myZip')

也许有人会这样写:

task prepareStaging {
    staging from stagingDir into toStagingDir
    syncJars from configurations.compile from fixedLibDir into toStagingLibsDir
    copyMainJar from libsDir into toStagingLibsDir
    myZip archiveName "bacnet.zip" from buildDir { include project.name+'/**' }
}

assemble.dependsOn('prepareStaging')

理想情况下,我喜欢自我记录的代码。在第二个例子中,对于下一个开发人员来说很明显,我的意思是每个小任务都不可重用。这非常清楚(即自我记录)。在第一种方式中,我编写的代码肯定不清楚,因为这些任务可以从其他项目文件中重复使用。

有什么方法可以用更简单的形式写出来吗?

注意:我仍然希望所有的UP-TO-DATE检查都能正常进行!!!

1 个答案:

答案 0 :(得分:1)

如果我理解正确,toStagingDirtoStagingLibDir只是在buildDir目录下创建的临时目录(在myZip任务中),那么下面应该做一个等同于你的工作:

task myZip(type: Zip){
  archiveName "bacnet.zip"
  into('staging'){
    from stagingDir
  }
  into('staging/libs'){
    from fixedLibDir
    from configurations.compile
    from libsDir 
    //or this, if you just want to include current projects jars
    from jar.outputs.files
  }
}

这里的想法不是自己创建一个临时目录,而是让gradle为你做。

只要你不打电话cleanMyZip,它就会进行UP-TO-DATE检查并做到最低限度。上次我检查Zip的行为与Sync非常相似,因为它会从zip中删除源中不再存在的所有文件。这可能与copyMainJar任务的行为略有不同,因为它的类型为Copy,这意味着如果您从libsDir删除文件,那么在我的情况下它会从zip中消失,但在您的代码不会。

不知道这是否与您所要求的相近,但希望它至少有一点用处:)

<强>精化:

gradle中的任务总是由设计AFAIK公开。有一个enhancement request但没有太多动作。您可以使用支持私有可见性的标准groovy方法,但它们不如任务那么强大。虽然,您会发现tasks can depend on groovy functions and more(或使用call()方法的任何内容),因此您可以执行以下操作:

def function = {
  println "function here!"
}

task myTask(dependsOn: function) << {
  println "myTask here!"
}

将生成:

function here!
:a:myTask
myTask here!

这应该给你一些灵活性,但如果你真的真的需要一个私人任务你可以做一些肮脏的黑客攻击(我知道Gradle家伙会讨厌我这个xx;)......这里是:

//Create a factory for creating tasks
import org.gradle.api.internal.project.taskfactory.ITaskFactory
def taskFactory = project.services.get(ITaskFactory)

//You can use the factory to create tasks without adding them to
//project.tasks, which will make them invisible to most irrelevant
//parts of your code, and they will not come up in `gradle tasks` list:

//Equivalent of:
// task myTask << {
//   println "i'm invisible"
// }
def privateTask = taskFactory.createTask([name: 'myTask']).doLast {
  println "i'm invisible"
}

//Equivalent of:
// task myCopyTask(type: Copy){
//   from configurations.compile
//   into 'libs'
// }
def privateCopyTask = taskFactory.createTask([name: 'myCopyTask', type: Copy])
                          .configure {
  from configurations.compile
  into 'lib-test'
}

//You can depend on the above tasks as usual from your public tasks:
task publicTask(dependsOn: [privateTask, privateCopyTask]) << {
  println "I'm public task"
}

注意:似乎可以在Gradle 1.2中使用,但使用风险自负!

祝你好运!