如何在gradle中编译本地文件?

时间:2015-10-30 06:00:05

标签: gradle

对于我们构建中的每个子项目,我们都有这样的结构:

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不支持其他方法支持的所有相同内容吗?

1 个答案:

答案 0 :(得分:1)

解决方法的废话解决方法是过滤掉FileCollection类型的元素:

  resolutionStrategy {
    libraries.each { libraryName, libraryList ->
      [libraryList].flatten()
                   .findAll { library ->
                     !(library instanceof FileCollection)
                   }
                   .each { library -> force library }
    }

    failOnVersionConflict()
  }

也许有更好的方法。