我有一个gradle任务,它在运行时创建,用于调用另一个任务(“myOtherTask”),该任务位于一个单独的gradle文件中。问题是如果不存在其他任务,则抛出异常。在尝试调用之前,是否可以检查外部gradle文件中是否存在任务?
例:
task mainTaskBlah(dependsOn: ':setupThings')
task setupThings(){
//...
createMyOtherTask(/*...*/)
//...
}
def createMyOtherTask(projName, appGradleDir) {
def taskName = projName + 'blahTest'
task "$taskName"(type: GradleBuild) {
buildFile = appGradleDir + '/build.gradle'
dir = appGradleDir
tasks = ['myOtherTask']
}
mainTaskBlah.dependsOn "$taskName"
}
您可以检查任务是否存在。例如,如果我们想要模拟这个,我们可以通过命令行属性触发任务创建
apply plugin: "groovy"
group = 'com.jbirdvegas.q41227870'
version = '0.1'
repositories {
jcenter()
}
dependencies {
compile localGroovy()
}
// if user supplied our parameter (superman) then add the task
// simulates if the project has or doesn't have the task
if (project.hasProperty('superman')) {
// create task like normal
project.tasks.create('superman', GradleBuild) {
println "SUPERMAN!!!!"
buildFile = project.projectDir.absolutePath + '/build.gradle'
dir = project.projectDir.absolutePath
tasks = ['myOtherTask']
}
}
// check if the task we are interested in exists on the current project
if (project.tasks.findByName('superman')) {
// task superman exists here we do whatever work we need to do
// when the task is present
def supermanTask = project.tasks.findByName('superman')
project.tasks.findByName('classes').dependsOn supermanTask
} else {
// here we do the work needed if the task is missing
println "Superman not yet added"
}
然后我们可以很容易地看到两种用例
$ ./gradlew -q build -Psuperman
SUPERMAN!!!!
$ ./gradlew -q build
Superman not yet added
这不会帮助您查找任务是否在特定的外部文件中,但是您只想确定是否在任何导入的gradle文件中定义了任务...
从gradlew help
我看到有一个tasks
任务。
可悲的是,gradlew tasks
并不总是显示所有的节目。我的一些项目有integrationTest
任务,而其他项目没有,在这种情况下我只能到build
。但是,默认的tasks
命令列出integrationTestClasses
但不列出integrationTest
。
从gradlew help --task tasks
我可以看到有一个报告扩展我们可以使用的--all
参数。
现在,我可以通过gradlew tasks --all
看到所有任务,所以一个简单的grep
可以告诉我我想要的任务是否存在。在bash中,这可能看起来像:
TASK="integrationTest"
if gradlew tasks --all | grep -qw "^$TASK"
then
gradlew clean integrationTest
else
gradlew clean build
fi
仅供参考 - 个人而言,我需要一些东西告诉我在git pre-commit钩子中是否存在integrationTest
任务,所以我知道我是否可以运行gradlew integrationTest
或者我是否必须停在gradlew build
。在这里找不到答案,我一直在寻找,这就是我想出来解决我的问题。希望这对其他人也有用。