我在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)
有什么想法吗?
谢谢, 莫罗
答案 0 :(得分:0)
在此上下文it
是String
变量:
[ "libraryA", "libraryB", ...].each {
it {
你不能称呼它,它不是一种方法。
您要调用的方法是委托到第三方上下文中定义的闭包,但您可以使用delegate
来引用它:
[ "libraryA", "libraryB", ...].each {
delegate."$it" {
另请参阅:http://docs.groovy-lang.org/latest/html/documentation/#_delegation_strategy