代码之家  ›  专栏  ›  技术社区  ›  gorefest

Gradle:我如何从导入的脚本中调用“def”?

  •  7
  • gorefest  · 技术社区  · 12 年前

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

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

    应用于:“gradle/glib/commons.gradle”

    在commons.grade内部,我定义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 回复  |  直到 12 年前
        1
  •  4
  •   cornuz    12 年前

    从…起 http://www.gradle.org/docs/current/userguide/writing_build_scripts.html :

    13.4.1.局部变量

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

    13.4.2.额外财产

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

    如果您声明为:

    ext.svnRevision = {
    ...
    }
    

    不要改变电话,我希望它会起作用。