【问题标题】:Gradle Native - Dynamically add libs in repositoryGradle Native - 在存储库中动态添加库
【发布时间】:2015-08-10 16:18:21
【问题描述】:

我在 Gradle 中移植了几个 Makefile 项目。我希望对每个依赖项进行版本控制,因此我创建了一个通用的 gradle 文件,即 general.gradle,它包含在每个特定的 build.gradle 文件中。对于每个项目,还有一个文件 dependencies.gradle,其中包含一个映射 {dependencyName, version}。举个例子:

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

我在general.gradle中声明libraryX指的是什么,将库插入到repositories中,如下:

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)

有什么想法吗?

谢谢, 毛罗

【问题讨论】:

  • 你可以尝试用"$it" {替换it {
  • @tim-yates 不幸的是它不起作用。这是输出:> Could not locate library 'libraryA'. > NativeLibrarySpec with name 'libraryA' not found. > Prebuilt library with name 'libraryA' not found in repositories '[libs]'. 如果我打印变量 libraryName 我看到它被赋值为 $it
  • 试试delegate."$it" {
  • 非常感谢@IgorArtamonov。现在它就像一个魅力!

标签: groovy gradle dependency-management build.gradle


【解决方案1】:

在这种情况下,it 是一个 String 变量:

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

你不能调用它,它不是一个方法。

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

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

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

【讨论】:

    猜你喜欢
    • 2015-12-04
    • 2023-03-25
    • 2016-02-12
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 2016-06-30
    相关资源
    最近更新 更多