如何在Gradle中将srcPaths设置为子目录集合中的特定子目录

时间:2019-07-08 06:53:42

标签: gradle

我正尝试将Github的现有开源库(最初是由(现在仍作为)很大,非常复杂的一组Eclipse项目创建)按摩到可以使用以下方法在Android Studio中直接构建的库:摇篮。

项目在此仓库中:https://github.com/unidata/awips2-core

它的依赖项在此仓库中:https://github.com/unidata/awips2-core-foss

awips2核心存储库具有以下目录结构:

./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

我在c:\ src \ awips2core-android中使用最小的Activity和名为“ app”的模块创建了Android Studio项目,然后继续将两个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')
}

这有效。

问题:

我在common /下还有另外41个srcDirs,而在edex /,features /和viz /下包括了近srcDirs。

我想做的是以编程方式添加它们,而不是一个接一个地添加它们。用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 for Gradle中实现此目标,或者使用Gradle实现此目标的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

这听起来像是一个多项目的构建:https://guides.gradle.org/creating-multi-project-builds/

我要么将所有内容放到同一根目录下,要么将foss放到一个单独的项目中,创建jar文件并发布到某个地方(用于测试的mavenLocal),并从awips2核心项目中创建一个多项目。

更新

很棒的事情是构建文件也是代码。

我没有尝试过您的Java代码,但这应该或多或少地收集目录,因为它在groovy中也是有效的。将目录收集到集合中之后(根据gradle文档,srcDirs是一个Set),然后可以在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
        }
    }
}