来自sourceSet的Gradle排除文件无效

时间:2016-09-09 18:41:56

标签: android gradle android-gradle

我有一个项目,我试图将java源文件树中的单个文件包含到库项目中。无论我做什么,我都不能只包含那个文件。我在另一个项目中取得了成功,排除了除一个文件之外的所有文件,但只有在从库项目运行gradle时才有效。从应用程序目录运行时,包含所有文件。在尝试创建一个可以重现问题的简单项目时,同样排除所有问题也不起作用。

示例文件树很简单:

application - android app that includes the two libraries
library1/
  build.gradle
  src/main/AndroidManifest.xml
library2/
  build.gradle
  src/main/AndroidManifest.xml
java/src/com/company/product/
  /pkg1
    Source1.java, Source2.java, Source3.java
    libraryoneonly/Library1Source.java
  /pkg2
    Source1.java, Source2.java, Source3.java

library1 build.gradle看起来像这样。下面的工作既不包括也不包括在内。

LIBRARY1 /的build.gradle

apply plugin: 'com.android.library'
android {
    sourceSets {
        main.jni.srcDirs = []
        main.jniLibs.srcDir 'src/main/libs'
        main.java {
            srcDir "../../java/src"
            exclude  {  FileTreeElement elem ->
                println "Searching for files, found: " + elem.relativePath
                !(elem.isDirectory() || elem.name.equals('Library1Source.java'))
            }
            //include ("**/libraryoneonly/**")
            //include ('com/company/product/pkg1/libraryoneonly/Library1Source.java')
        }
    }
dependencies {
    compile project(':library2')
}

和library2 build.gradle。令人惊讶的是,下面的未注释排除确实有效。

library2 /的build.gradle

apply plugin: 'com.android.library'

android {
        sourceSets {
            main.jni.srcDirs = []
            main.jniLibs.srcDir 'src/main/libs'
            main.java {
                srcDir "../../java/src"
                //exclude  {  FileTreeElement elem -> ((elem.path.contains('/libraryoneonly/')) ) }
                exclude ('com/company/product/pkg1/libraryoneonly/Library1Source.java')
            }
        }

请注意,我在构建library1时从未看到“搜索文件,找到”文本。我不知道为什么。我确实在较大的项目中看到了这个测试的模型,取决于构建的运行位置。

如果您想拉出示例项目并进行试用,请点击以下链接:https://github.com/gbak/gradleTest

3 个答案:

答案 0 :(得分:8)

我终于找到了包含单个文件的方法,而没有修改srcDir路径:

main.java {
    srcDir "../../java/src"
    setIncludes(new HashSet(['com/company/product/pkg1/libraryoneonly/*.java']))
}

路径'**/*.java'自动包含在include中,添加更多包含,就像直接包含到源文件中一样,因为它已经包含在路径中了。

setIncludes()调用会替换任何现有的包含,包括'**/*.java',并将提供的路径[s]设置为唯一的包含路径。

阅读文档并在main.java帮助之后添加建议的printf语句。

main.java.getIncludes().each { println "Added include: $it" }
main.java.sourceFiles.each { println "File in source set: " + it }

感谢所有帮助过的人。

答案 1 :(得分:6)

Gradle&#39 SourceEirectorySet似乎缺少功能。 docs有一个非常有说服力的说明:

  

TODO - 为各个源目录配置包含/排除,并与CopySpec TODO同步 - 允许添加FileTree

缺少与CopySpec相同的功能意味着没有合理的方式来做你要求的事情。 BEGIN SET @ven = NEW.`ven_code`; SET @ventable = concat('pp_ven_',@ven); UPDATE @ventable SET `stock_qty`=NEW.`endingStock` WHERE `iin`=NEW.`iin`; END 模式首先将文件列表添加到sourceSet,然后您可以include来自该集合的一些文件。除外,

  1. exclude sourceset隐式添加了main.java
  2. 没有排除所有不是
  3. 的内容

    意味着你是SOL。

    您可以声明一个单独的**\*.java源集并使用仅包含该文件,但我无法弄清楚如何将新的源集添加到编译路径中。黑客建议here,使用编译器args不再工作,java抱怨无效标志。

    我能想到的唯一解决方法是使用一个路径,将{1}}中不需要的文件排除在库1之外

    main.somethingElse

答案 2 :(得分:3)

您的代码似乎对我来说是正确的,只是像FileCollections这样的sourceFiles被懒惰地评估,即您的println语句直到实际上正在请求源集。

添加类似

的内容
main.java.sourceFiles.each { println "File in source set: " + it }
main.java {...}关闭后

实际上应该使println工作。