如何在build.gradle中定义和调用自定义方法

时间:2015-01-05 10:28:16

标签: groovy gradle

作为我项目的一部分,我需要从目录中读取文件并在构建脚本中执行所有这些操作。对于每个文件,操作是相同的(读取一些SQL查询并执行它)。我认为它是一个重复的任务,更好地在一个方法内写。由于我是新手,我不知道应该如何。请帮忙。

6 个答案:

答案 0 :(得分:80)

下面给出了一种方法:

ext.myMethod = { param1, param2 ->
    // Method body here
}

请注意,这是为项目范围创建的,即。全局可用于项目,可以使用myMethod(p1, p2)等同于project.myMethod(p1, p2)

在构建脚本中的任何位置调用

该方法也可以在不同的范围内定义,例如在任务中:

task myTask {
    ext.myMethod = { param1, param2 ->
        // Method body here
    }

    doLast {
        myMethod(p1, p2) // This will resolve 'myMethod' defined in task
    }
}

答案 1 :(得分:21)

您可以通过以下方式定义方法:

// Define an extra property
ext.srcDirName = 'src/java'

// Define a method
def getSrcDir(project) {
    return project.file(srcDirName)
}

您可以在gradle文档Chapter 62. Organizing Build Logic

中找到更多详细信息

答案 2 :(得分:19)

如果您在任何其他文件中定义了任何方法* .gradle - ext.method()使其可以在项目范围内访问。例如,这是一个

  

versioning.gradle

// ext makes method callable project wide
ext.getVersionName = { ->
    try {
        def branchout = new ByteArrayOutputStream()
        exec {
            commandLine 'git', 'rev-parse', '--abbrev-ref', 'HEAD'
            standardOutput = branchout
        }
        def branch = branchout.toString().trim()

        if (branch.equals("master")) {
            def stdout = new ByteArrayOutputStream()
            exec {
                commandLine 'git', 'describe', '--tags'
                standardOutput = stdout
            }
            return stdout.toString().trim()
        } else {
            return branch;
        }
    }
    catch (ignored) {
        return null;
    }
}
  

的build.gradle

task showVersion << {
    // Use inherited method
    println 'VersionName: ' + getVersionName()
}

如果没有ext.method()格式,该方法只能在声明它的* .gradle文件中使用。这与属性相同。

答案 3 :(得分:8)

包含方法的根对象的示例。

hg.gradle文件:

ext.hg = [

    cloneOrPull: { source, dest, branch ->
        if (!dest.isDirectory())
            hg.clone(source, dest, branch)
        else
            hg.pull(dest)
        hg.update(dest, branch)
    },

    clone: { source, dest, branch ->
        dest.mkdirs()
        exec {
            commandLine 'hg', 'clone', '--noupdate', source, dest.absolutePath
        }
    },

    pull: { dest ->
        exec {
            workingDir dest.absolutePath
            commandLine 'hg', 'pull'
        }
    },

]

build.gradle文件

apply from: 'hg.gradle'

hg.clone('path/to/repo')

答案 4 :(得分:3)

不知何故,也许是因为距OP已有5年了,但没有一个

ext.someMethod = { foo ->
   methodBody
}
方法正在为我工​​作。相反,一个简单的函数定义似乎可以在gradle文件中完成工作:

def retrieveEnvvar(String envvar_name) {
    if ( System.getenv(envvar_name) == "" ) {
        throw new InvalidUserDataException("\n\n\nPlease specify environment variable ${envvar_name}\n")
    } else {
        return System.getenv(envvar_name)
    }       
}

然后我在脚本的其他地方调用它,没有前缀,即retrieveEnvvar("APP_PASSWORD")

这是2020年,所以我正在使用Gradle 6.1.1。

答案 5 :(得分:0)

@ether_joe在上可以通过@InvisibleArrow投票最多,答案是,但是您必须定义调用之前调用的方法,即在{{1的更早版本中}}文件。

您可以看到示例here。我已经在Gradle 6.5中使用了这种方法,并且有效。