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



我正在尝试将Github中现有的开源库(该库最初创建(并且目前维护为)一组非常非常大且复杂的Eclipse项目整理成可以使用Gradle直接在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 中使用一个名为"app"的最小活动和模块创建了 Android Studio 项目,然后继续将两个 Git 存储库签入项目根目录的子目录中:

cd srcawips2core-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/、功能/和 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 核心项目创建一个多项目。

更新

gradle 的伟大之处在于构建文件也是代码。

我没有尝试您的 java 代码,但这应该或多或少地收集目录,因为它在 groovy 中也有效。一旦你把目录收集到一个集合中(根据gradle文档,srcDirs是一个集合),那么你就可以在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
}
}
}

最新更新