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

标签 gradle

我正在尝试将 Github 中一个现有的开源库进行按摩,该库最初创建(并且当前维护为)一组非常、非常大和复杂的 Eclipse 项目,可以使用 Gradle 在 Android Studio 中直接构建。

项目在这个 repo 中:https://github.com/unidata/awips2-core

它的依赖关系在这个 repo 中: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

我在 c:\src\awips2core-android 中创建了一个具有最小 Activity 和名为“app”的模块的 Android Studio 项目,然后将两个 Git 存储库 check out 到项目根目录的子目录中:
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/下的那些包括在内时,几乎有一百个。

我想做的是以编程方式添加它们,而不是一一添加。在 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 实现这一点的正确方法是什么?

最佳答案

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

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

更新

gradle 的好处在于构建文件也是代码。

我没有尝试你的java代码,但这应该或多或少地收集目录,因为它在groovy中也是有效的。一旦您将目录收集到一个集合中(根据 gradle 文档,srcDirs 是一个集合),那么您可以在 sourceSets block 中使用它。

我会使用流写一些东西:

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

关于gradle - 如何将 Gradle 中的 srcPaths 设置为子目录集合中的特定子目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56929712/

相关文章:

android - 评估设置 'android' 时出现问题。 gradle.groovy 不存在

android - 有条件地应用 Gradle 插件

gradle - 如何调试 Gradle 为什么使用我在依赖子项目中指定的不同版本的库?

spring-boot - 如何在多模块项目中使用 Spring BOOT 和 Gradle 实现 AspectJ 编译时编织(编织所有模块)?

gradle - Javadoc 和 --enable-preview

java - 安卓。添加 Firebase 依赖项时出现问题

groovy - 从: to: in Gradle script申请施工

android - 为了编写自定义gradle任务,我需要在项目中包含哪些文件?

intellij-idea - 使用IntelliJ将版本信息添加到jar文件名

gradle - 将Gradle任务标记为 “failed”