代码之家  ›  专栏  ›  技术社区  ›  Mr.H.

如何在外部文件中定义函数?

  •  4
  • Mr.H.  · 技术社区  · 6 年前

    我正在体验gradle/groovy的一种奇怪行为。

    我有一个 bulid.gradle 看起来是这样的:

    def elastic(notation, projectName) {
       if (allprojects.find { it.name == projectName }) {
          println "adding project dependency on project $projectName"
          project(projectName)
       } else { 
          println "adding binary dependency on project $projectName"
          dependencies.create(notation)
       }
    }
    
    dependencies {
       elastic('my.group:myProject:1.0','myProject')
    }
    

    如果没有名称为的项目,此函数将返回二进制依赖项 myProject 否则,它将返回项目依赖项。 但这不是重点。我在不同的项目中经常使用这个函数,而且效果很好。但为了避免冗余代码,我尝试将该函数外部化。所以我把它放进 define_elastic_1.gradle 并将该文件应用到我的 build.gradle .现在看起来是这样的:

    apply from: "file://entw1/ENTWICKLUNG/GfOPGradleRepo/define_elastic_1.gradle"
    dependencies{
        elastic('my.group:myProject:1.0','myProject')
    } 
    

    但当我 gradle build 上面写着

    Could not find method elastic() for arguments [my.group:myProject:1.0, myProject] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.
    

    你知道为什么我不能使用一个单独文件中定义的函数吗?

    2 回复  |  直到 6 年前
        1
  •  4
  •   Opal    6 年前

    尝试将函数定义为闭包和via ext 在里面 define_elastic_1.gradle :

    ext.elastic = { notation, projectName ->
       if (allprojects.find { it.name == projectName }) {
          println "adding project dependency on project $projectName"
          project(projectName)
       } else {
          println "adding binary dependency on project $projectName"
          dependencies.create(notation)
       }
    }
    
        2
  •  2
  •   lance-java    6 年前

    在我看来,这个功能应该与 DependencyHandler 而不是 Project 按照@opal的建议

    例如:

    dependencies.ext.elastic = { notation, projectName ->
       // do stuff
    } 
    dependencies {
        elastic('my.group:myProject:1.0','myProject')
    }