Как установить srcPaths в Gradle для определенного подкаталога в коллекции подкаталогов - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь втиснуть существующую библиотеку с открытым исходным кодом из Github, которая была изначально создана (и в настоящее время поддерживается как) очень, очень большой и сложный набор проектов Eclipse, во что-то, что может быть непосредственно встроено в Android Studio с помощью Gradle.

Проекты в этом репо: https://github.com/unidata/awips2-core

Его зависимости находятся в этом репо: https://github.com/unidata/awips2-core-foss

Репозиторий awips2-core имеет следующую структуру каталогов:

./awips2-core/common/
./awips2-core/edex/
./awips2-core/features/
.awips2-core/viz/

Каждый из этих четырех каталогов содержит каталоги верхнего уровня для нескольких проектов с такими именами, как "com.raytheon.uf.common.util"

Эти каталоги имеют следующее содержимое (на примере проекта 'util'):

META-INF
src  (contains ./com/raytheon/uf/common/util/*.java)
tests (same as src)
.classpath
.project
build.properites
com.raytheon.uf.common.util.ecl

Я создал проект Android Studio с минимальным Activity и модулем с именем app в c: \ src \ awips2core-android, затем приступил к проверке двух репозиториев Git в подкаталогах корневого каталога проекта:

cd \src\awips2core-android
git clone https://github.com/unidata/awips2-core
git clone https://github.com/unidata/awips2-core-foss

Затем я изменил settings.gradle:

include ':awips2core'
include ':app'

project(':awips2core').projectDir = new File('./awips2-core')

... и добавил /src/awips2core-android/awips2-core/build.gradle:

apply plugin: 'java'

sourceSets {
    main {
        java {
            srcDirs = ['common/com.raytheon.uf.common.util/src', 'common/com.raytheon.uf.common.wxmath/src']
        }
    }
}

dependencies {
    compile fileTree(dir: '../awips2-core-foss')
}

Это работает.

Проблема:

У меня есть еще 41 srcDirs в общем /, и почти сто, если вы включите те в edex /, features / и viz /.

Мне бы хотелось добавить их программно, а не по одному. В терминах Java что-то вроде:

List<File> srcPaths = new ArrayList<File>();
String[] paths =  {"common", "features", "edex", "viz"};
for(String subdir : paths) {
    // the path "c:/src/awips2core-android/awips2-core" would be implied by the project's definition in gradle.settings
    File projDir = new File("c:/src/awips2core-android/awips2-core", subdir);
    File[] subprojectDirs = projDir.listFiles();
    for (File dir : subprojectDirs)
        srcPaths.add(new File(dir, "src"));
}

// now, set set Gradle's srcDirs to srcPaths' elements...

Итак ... Как мне реализовать это в Groovy для Gradle или как правильный способ добиться этого с помощью Gradle?

1 Ответ

1 голос
/ 08 июля 2019

Это звучит как сборка из нескольких проектов: https://guides.gradle.org/creating-multi-project-builds/

Я бы либо поместил все под одним и тем же корнем, либо поместил foss в отдельный проект, создал бы файл jar и опубликовал где-нибудь (mavenLocal для теста) и создайте мультипроект из проекта awips2-core.

update

Отличная вещь с gradle в том, что файлы сборки тоже являются кодом.

Я не пробовал ваш java-код, но он должен работать более или менее для сбора каталогов, так как он действителен и в Groovy.После того, как вы собрали каталоги в коллекцию (srcDirs - это Set в соответствии с документацией gradle), вы можете использовать это в блоке sourceSets.

Я бы написал что-то подобное, используя потоки:

def srcPaths = ["common", "features", "edex", "viz"].stream()
        .map { new File(projectDir, it) }
        .flatMap { it.listFiles().toList().stream() }
        .map { new File(it, "src") }
        .toSet()

sourceSets {
    main {
        java {
            srcDirs = srcPaths
        }
    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...