2

我对 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 检查都像往常一样进行!!!

4

1 回答 1

1

如果我理解正确,并且toStagingDir只是toStagingLibDir在目录下创建的临时目录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,它就会进行最新检查并做最低限度的检查。上次我检查Zip的行为很像Sync,因为它会从 zip 中删除源中不再存在的所有文件。这可能与任务略有不同copyMainJar,因为它是类型Copy,这意味着如果您libsDir从那时删除一个文件,在我的情况下它会从 zip 中消失,但在您的代码中它不会。

不知道这是否接近你的要求,但希望它至少有点用处:)

阐述:

gradle 中的任务在设计上始终是公开的 AFAIK。有一个增强请求,但没有采取太多行动。您可以使用支持私有可见性的标准 groovy 方法,但它们不如任务强大。虽然,您会发现任务可能依赖于 groovy 函数等等(或任何有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 中工作,但使用风险自负!

祝你好运!

于 2012-10-13T00:33:51.103 回答