我有一个在运行时创建的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"
}
答案 0 :(得分:9)
您可以检查任务是否存在。例如,如果我们想要模拟这个,我们可以通过命令行属性
触发任务创建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
答案 1 :(得分:0)
这不会帮助您找到任务是否在特定于的外部文件中,但是如果您只是想确定任务是否在中定义为任何您导入的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
还是必须在{{1}停下来}。在这里找不到答案,我一直在寻找,这就是我想出的解决问题的方法。希望这对其他人也有用。
答案 2 :(得分:0)
我为类似的东西制作了一个“工具”-也许对某些人来说很方便...
$ cat if_gradle_task_exists
#!/bin/sh
TASKS=$(./gradlew tasks --all)
BUILD="./gradlew "
for COMMAND in $@; do
echo "$TASKS" | grep -q "$COMMAND" && BUILD="$BUILD $COMMAND"
done
$BUILD
您可以添加任意多个任务,并且仅执行现有任务。
我将它与alias
结合使用,作为我要在不同项目中完成的任务的一种超级api包装器(并且我不必关心是否有任何特定任务确实在做存在):
alias ge='~/.config/bin/if_gradle_task_exists eclipse initDb createTestUsers startLdapServerMock startBrokerMock'
这使我像ge
一样懒惰
stumpf@HV000408:/c/devel/workspace/myproject $> ge
为Eclipse建立项目并为本地开发准备所有必需的服务器。
产生的任务列表将需要一些时间来设置,因此我不建议将其用作完整的gradlew
包装器。
致谢