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 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')
}
}
Чтобы заметить, я никогда не вижу текст "Поиск файлов, найденных" при создании библиотеки1. Я не знаю, почему. Я вижу это в более крупном проекте, с которым этот тест был смоделирован, в зависимости от того, где была выполнена сборка.
Если вы хотите вытащить образец проекта и попробовать его, вот ссылка: https://github.com/gbak/gradleTest
Ответы
Ответ 1
Наконец я понял, как включить один файл, не изменяя путь srcDir
:
main.java {
srcDir "../../java/src"
setIncludes(new HashSet(['com/company/product/pkg1/libraryoneonly/*.java']))
}
Путь '**/*.java'
автоматически включается как include, добавление каких-либо дополнительных включений, например, прямой include в исходный файл, ничего не делает, поскольку он уже включен в путь.
Вызов setIncludes()
заменяет любые существующие включенные, включая '**/*.java'
, и устанавливает предоставленный путь [s] как единственный путь включения.
Чтение документов и добавление предлагаемых заявлений printf после того, как main.java помогло.
main.java.getIncludes().each { println "Added include: $it" }
main.java.sourceFiles.each { println "File in source set: " + it }
Спасибо всем, кто помог.
Ответ 2
Gradle 'В SourceDirectorySet отсутствуют функции. docs имеет очень важное замечание:
TODO - настройка включает/исключает для отдельных исходных dirs и синхронизирует с CopySpec TODO - позволяет добавлять FileTree
Отсутствие функций наравне с CopySpec означает, что нет логичного способа делать то, что вы просите. Шаблон include
сначала добавляет список файлов в исходный набор, а затем вы можете exclude
несколько файлов из этого набора. Кроме того,
- Исходный набор
main.java
неявно добавляет **\*.java
- Не исключено все, что не является
означает, что вы SOL.
Вы можете объявить отдельный исходный набор main.somethingElse
и использовать только один файл, но мне не удалось выяснить, как добавить новый набор источников в путь компиляции. Hack предложил здесь, использование компилятора args больше не работает, java жалуется на недопустимые флаги.
Единственным обходным решением, которое я могу придумать, является использование пути, который исключает файлы, которые вы не хотите использовать в main.java.srcDir
для библиотеки1
main.java {
srcDir '../../java/src/com/company/product/pkg1/libraryoneonly'
}
Ответ 3
Ваш код кажется мне правильным, это просто FileCollections, например sourceFiles оцениваются лениво, т.е. ваш оператор println
не выполняется до тех пор, пока содержимое исходного набора не будет запрошено.
Добавление чего-то типа
main.java.sourceFiles.each { println "File in source set: " + it }
после закрытия main.java {...}
должно фактически сделать работу println
.