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

时间:2018-04-25 07:40:06

标签: gradle groovy build build.gradle

我遇到了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 个答案:

答案 0 :(得分:3)

尝试将函数定义为闭包,并通过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)
   }
}

答案 1 :(得分:2)

在我看来,此功能应该与DependencyHandler相关联,而不是@opal

建议的Project

例如:

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