Gar*_*Bak 16 android gradle android-gradle-plugin
我有一个项目,我试图将一个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
Run Code Online (Sandbox Code Playgroud)
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')
}
Run Code Online (Sandbox Code Playgroud)
和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')
}
}
Run Code Online (Sandbox Code Playgroud)
需要注意的是,当library1构建时,我从未看到"搜索文件,找到"文本.我不知道为什么.我确实在较大的项目中看到了这个测试的建模,具体取决于构建的运行位置.
如果您想拉出示例项目并试用它,请点击以下链接:https: //github.com/gbak/gradleTest
我终于找到了包含单个文件的方法,而没有修改srcDir路径:
main.java {
srcDir "../../java/src"
setIncludes(new HashSet(['com/company/product/pkg1/libraryoneonly/*.java']))
}
Run Code Online (Sandbox Code Playgroud)
该路径'**/*.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 }
Run Code Online (Sandbox Code Playgroud)
感谢所有帮助过的人.
Gradle'e SourceDirectorySet似乎缺少功能.docs有一个非常有说服力的说明:
TODO - 为各个源目录配置包含/排除,并与CopySpec TODO同步 - 允许添加FileTree
缺少与CopySpec相同的功能意味着没有合理的方法可以满足您的要求.该include模式首先将一个文件列表添加到sourceSet,然后您可以exclude从该集合中添加一些文件.除了,
main.java隐含地添加**\*.java意味着你是SOL.
您可以声明一个单独的main.somethingElse源集并使用仅包含该文件,但我无法弄清楚如何将新的源集添加到编译路径中.这里提到的hack ,使用编译器args不再起作用,java抱怨无效标志.
我能想到的唯一解决方法是使用一个路径,将您不想要的文件排除在main.java.srcDir库1之外
main.java {
srcDir '../../java/src/com/company/product/pkg1/libraryoneonly'
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6055 次 |
| 最近记录: |