我还不知道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检查都能正常进行!!!
答案 0 :(得分: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
,它就会进行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中使用,但使用风险自负!
祝你好运!