Gradle Native - 在存储库中动态添加库

时间:2015-05-28 08:59:06

标签: groovy gradle dependency-management build.gradle

我在Gradle中移植了几个Makefile项目。我希望每个依赖项都被版本化,因此我创建了一个公共的gradle文件,即general.gradle,它包含在每个特定的build.gradle文件中。对于每个项目,还有一个文件dependencies.gradle,它包含一个map {dependencyName,version}。这是一个例子:

ext.versions  = [:]    
versions.'libraryA'= "8a3f32"
versions.'libraryB'= "4af3e5"

我在general.gradle中声明了libraryX引用的内容,将库插入到存储库中,如下所示:

repositories {        
 libs(PrebuiltLibraries) {        
  libraryA {
      def libraryName = "${name}"
      headers.srcDir "../${libraryName}"
      binaries.withType(SharedLibraryBinary) {                     
        sharedLibraryFile = file("${baseDir}/lib/${targetPlatform.name}/${buildType.name}/lib${libraryName}_" + versions."${libraryName}" + ".so")
       }         
   }

   libraryB {
      def libraryName = "${name}"
      headers.srcDir "../${libraryName}"
      binaries.withType(SharedLibraryBinary) {                    
         sharedLibraryFile = file("${baseDir}/lib/${targetPlatform.name}/${buildType.name}/lib${libraryName}_" + versions."${libraryName}" + ".so")
      }         
   }

   libraryC {....}
   libraryD {....}
}

通过这种方式,我还可以根据构建类型(调试或发布)和平台(x86或x86_64)设置正确的路径。

正如您所看到的,在每个libraryX中都有相同的代码。我想知道我是否可以使用列表来避免这种不必要的重复

libraries = [ "libraryA", "libraryB", ...]

我尝试过:

repositories {        
      libs(PrebuiltLibraries) {        
       [ "libraryA", "libraryB", ...].each {
        it {
          def libraryName = "${name}"
          headers.srcDir "../${libraryName}"
          binaries.withType(SharedLibraryBinary) {                    
             sharedLibraryFile = file("${baseDir}/lib/${targetPlatform.name}/${buildType.name}/lib${libraryName}_" + versions."${libraryName}" + ".so")
          }         
       }
     }                
    }

但是我收到了这个错误:

Exception thrown while executing model rule: model.repositories   > No signature of method: java.lang.String.call() is applicable for argument types: (general_dt1njom2wz075lo490p9e44em$_run_closure3_closure24_closure25_closure26_closure29) values: 
[general_dt1njom2wz075lo490p9e44em$_run_closure3_closure24_closure25_closure26_closure29@2b2954e1]        
     Possible solutions: wait(), any(), wait(long), take(int), each(groovy.lang.Closure), any(groovy.lang.Closure)

有什么想法吗?

谢谢, 莫罗

1 个答案:

答案 0 :(得分:0)

在此上下文itString变量:

[ "libraryA", "libraryB", ...].each {
    it {

你不能称呼它,它不是一种方法。

您要调用的方法是委托到第三方上下文中定义的闭包,但您可以使用delegate来引用它:

[ "libraryA", "libraryB", ...].each {
    delegate."$it" {

另请参阅:http://docs.groovy-lang.org/latest/html/documentation/#_delegation_strategy