2015-05-28 2 views
2

Я портирую несколько проектов Makefile в Gradle. Я хочу, чтобы каждая зависимость была версией, поэтому я создал общий файл gradle, а именно general.gradle, который включен в каждый конкретный файл build.gradle. Для каждого проекта есть также файл dependencies.gradle, который содержит карту {dependencyName, version}. Вот пример:Gradle Native - динамически добавлять библиотеки в репозитории

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

Я заявляю, что libraryX ссылается в general.gradle, вставив библиотеки в репозиториях, следующим образом:

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).

Как вы можете видеть, внутри каждой библиотекиX есть такой же код. Мне было интересно, если я мог бы избежать этого ненужного дублирования, используя список

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_dt1njom2wz075lo4[email protected]2b2954e1]   
    Possible solutions: wait(), any(), wait(long), take(int), each(groovy.lang.Closure), any(groovy.lang.Closure) 

Любая идея?

Спасибо, Mauro

+0

Вы можете попробовать заменяя 'it {' с '" $ it "{' –

+0

@ tim-yates К сожалению, это не сработает. это вывод: '> Не удалось найти библиотеку 'libraryA'. > NativeLibrarySpec с именем 'libraryA' не найден. > Предварительная библиотека с именем 'libraryA' не найдена в репозиториях '[libs]'. ' и если я печатаю переменную' libraryName', я вижу, что ей присвоено значение $ it – Mauro

+0

try 'delegate. '$ It" {' –

ответ

0

В этом контексте it является String переменная:

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

Вы не можете назвать его, это не метод.

метод, который вы хотите звонить в делегированы закрытия, определенный в контексте третьей стороны, но вы можете обратиться к нему с помощью delegate:

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

Смотри также: http://docs.groovy-lang.org/latest/html/documentation/#_delegation_strategy

Смежные вопросы