Gradle从sourceSet中排除文件不工作



我有一个项目,我试图从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

库1构建。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。令人惊讶的是,下面没有注释的exclude确实有效。

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')
            }
        }

只是要注意,我从来没有看到"搜索文件,发现"的文本时,图书馆1正在建设。我不知道为什么。我确实在更大的项目中看到了这个测试的建模,这取决于构建是从哪里运行的。

如果您想拉出示例项目并尝试一下,这里有一个链接:https://github.com/gbak/gradleTest

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

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

路径'**/*.java'被自动包含为包含,添加任何更多的包含,就像直接包含到源文件一样,没有任何作用,因为它已经是包含路径。

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

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

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

感谢所有帮助过我的人。

Gradle' s SourceDirectorySet似乎缺少一些功能。Docs有一个很有说服力的注释:

TODO -配置包含/排除单个源目录,并同步CopySpec TODO -允许添加文件树

缺乏与CopySpec相当的功能意味着没有一种合乎逻辑的方法来完成您的要求。include模式首先将文件列表添加到源集,然后您可以从该集中exclude一些文件。除了

    main.java源集隐式添加***.java
  1. 没有排除所有不

表示你是SOL。

您可以声明一个单独的main.somethingElse源集,并使用只包含一个文件,但我无法弄清楚如何将新的源集添加到编译路径。这里建议的hack,使用编译器参数不再工作,java抱怨无效标志。

我能想到的唯一解决办法是使用一个路径,排除你不希望在main.java.srcDir的library1

文件
    main.java {
        srcDir '../../java/src/com/company/product/pkg1/libraryoneonly'
    }

你的代码似乎对我来说是正确的,只是像sourceFiles这样的FileCollections被惰性地评估,即你的println语句不执行,直到源集的内容实际被请求。

添加类似

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

实际上应该使println工作

最新更新