Я портирую несколько проектов 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
Вы можете попробовать заменяя 'it {' с '" $ it "{' –
@ tim-yates К сожалению, это не сработает. это вывод: '> Не удалось найти библиотеку 'libraryA'. > NativeLibrarySpec с именем 'libraryA' не найден. > Предварительная библиотека с именем 'libraryA' не найдена в репозиториях '[libs]'. ' и если я печатаю переменную' libraryName', я вижу, что ей присвоено значение $ it – Mauro
try 'delegate. '$ It" {' –