确定是否在外部build.gradle文件中定义了任务

时间:2016-12-19 17:24:47

标签: gradle groovy

我有一个在运行时创建的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"
}

3 个答案:

答案 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包装器。

致谢