gpt4 book ai didi

gradle - 有什么方法可以写更简洁的gradle?

转载 作者:行者123 更新时间:2023-12-03 03:24:36 25 4
gpt4 key购买 nike

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

最佳答案

如果我理解正确,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它将进行最新的检查并做最少的事情。上次查看 Zip行为很像 Sync ,因为它会从 zip 中删除源中不再存在的所有文件。这可能与 copyMainJar 略有不同。任务,因为它的类型是 Copy这意味着如果您曾经从 libsDir 中删除文件那么在我的情况下,它会从 zip 中消失,但在你的代码中它不会。

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

阐述:

gradle 中的任务在设计上始终是公开的 AFAIK。有一个 enhancement request但没有太多的行动。您可以使用支持私有(private)可见性的标准 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!

这应该给你一些灵 active ,但如果你真的真的需要一个私有(private)任务,你可以做一些肮脏的黑客行为(我知道 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 中工作,但使用风险自负!

祝你好运!

关于gradle - 有什么方法可以写更简洁的gradle?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12861129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com