Gradle:我怎么称呼' def'从导入的脚本?

时间:2014-09-03 10:05:02

标签: gradle build.gradle

我目前正在模块化我们的gradle构建,以便拥有一个包含许多全局内容的libs / commons.gradle文件。我需要这个,因为并行开发的软件的各个分支,我们希望避免在所有分支之间传播每个脚本文件的变化。

所以我创建了这个lib文件并使用“apply from”来加载它:

申请来自:'gradle / glib / commons.gradle'

在commons.gradle中我定义了svnrevision函数:

...

def svnRevision = {
    ISVNOptions options = SVNWCUtil.createDefaultOptions(true);
    SVNClientManager clientManager = SVNClientManager.newInstance(options);
    SVNStatusClient statusClient = clientManager.getStatusClient();
    SVNStatus status = statusClient.doStatus(projectDir, false);
    SVNRevision revision = status.getCommittedRevision();
    return revision.getNumber().toString();
}

...

我正在调用包含build.gradle的函数:

...

task writeVersionProperties {
    File f = new File(project.webAppDirName+'/WEB-INF/version.properties');
    if (f.exists()) { f.delete(); }

    f = new File(project.webAppDirName+'/WEB-INF/version.properties');
    FileOutputStream os = new FileOutputStream(f);
    os.write(("version="+svnRevision()).getBytes());
    os.flush();
    os.close();
}

...

但我最终进入了:

...

FAILURE: Build failed with an exception.

    * Where:
    Build $PATH_TO/build20.gradle

    * What went wrong:
    A problem occurred evaluating root project 'DEV_7.X.X_GRADLEZATION'.
    > Could not find method svnRevision() for arguments [] on root project 'DEV_7.X.X_GRADLEZATION'.

...

所以我的问题是:如何在gradle中调用子函数,这是在包含的脚本中定义的?

任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:4)

来自http://www.gradle.org/docs/current/userguide/writing_build_scripts.html

  

13.4.1。局部变量

     

使用def关键字声明局部变量。它们只是   在声明它们的范围内可见。局部变量   是底层Groovy语言的一个特性。

     

13.4.2。额外属性

     

Gradle域模型中的所有增强对象都可以容纳额外的对象   用户定义的属性。这包括但不限于   项目,任务和源集。可以添加,阅读额外的属性   并通过拥有对象的ext属性设置。或者,分机   block可以用于一次添加多个属性。

如果您将其声明为:

ext.svnRevision = {
...
}

并且不要更改通话,我希望它能够正常工作。