对于我们构建中的每个子项目,我们都有这样的结构:
apply from: '../dependencies.gradle'
dependencies {
... omitting other dependencies ...
compile libraries.poi
}
这些库在dependencies.gradle
中定义,如下所示:
ext.libraries = [
... omitting other libraries ...
poi: [
'poi:poi:3.9.custom.1',
'poi:poi-ooxml:3.9.custom.1',
'poi:poi-ooxml-schemas:3.9.custom.0',
'poi:poi-scratchpad:3.9.custom.0',
],
... omitting other libraries ...
]
几天前,我想尝试一些针对夜间POI构建的内容。每晚构建不会进入他们的存储库,因此我不得不尝试使用本地文件。
查看文档,你应该使用files(...)
,所以我尝试了这个:
poi: [
files('/path/to/poi-3.14-beta1/poi-3.14-beta1-20151027.jar'),
files('/path/to/poi-3.14-beta1/poi-3.14-ooxml-20151027.jar'),
files('/path/to/poi-3.14-beta1/poi-3.14-ooxml-schemas-20151027.jar'),
files('/path/to/poi-3.14-beta1/poi-3.14-scratchpad-20151027.jar'),
],
当我运行时,我收到错误:
* What went wrong:
A problem occurred evaluating root project 'product'.
> Cannot convert the provided notation to an object of type ModuleVersionSelector: file collection.
The following types/formats are supported:
- Instances of ModuleVersionSelector.
- String or CharSequence values, for example 'org.gradle:gradle-core:1.0'.
- Maps, for example [group: 'org.gradle', name:'gradle-core', version: '1.0'].
- Collections or arrays of any other supported format. Nested collections/arrays will be flattened.
所以真的看起来files()
实际上并不起作用,因为它不会返回此处列出的内容之一。
这样做的正确方法是什么? (假设它甚至可能!)
修改:更多信息
现在我更新到Gradle 2.8,我得到一个指向问题的行号。它指向一些自定义构建代码,我们将其用于解决Gradle sucking at dependency resolution:
resolutionStrategy {
libraries.each {
libraryName, libraryList ->
libraryList.each {
library -> force library // this line
}
}
failOnVersionConflict()
}
所以我认为问题在于,force不支持其他方法支持的所有相同内容吗?
答案 0 :(得分:1)
解决方法的废话解决方法是过滤掉FileCollection
类型的元素:
resolutionStrategy {
libraries.each { libraryName, libraryList ->
[libraryList].flatten()
.findAll { library ->
!(library instanceof FileCollection)
}
.each { library -> force library }
}
failOnVersionConflict()
}
也许有更好的方法。