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

问题描述 投票:5回答:2

我有一个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"
}
gradle groovy
2个回答
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

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或者我是否必须停在gradlew build。在这里找不到答案,我一直在寻找,这就是我想出来解决我的问题。希望这对其他人也有用。

© www.soinside.com 2019 - 2024. All rights reserved.