【发布时间】: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