在构建时选择性地在Android项目中包含模块的单行程序吗?

时间:2016-12-19 04:33:46

标签: java android gradle android-gradle

我设置了一个Android项目,因此使用模块系统作为插件的一种方式"选择性地。

这是项目层次结构的样子:

  • 应用
    • 清单
    • 的java
    • 资产
    • RES
  • 模块1
    • 清单
    • 的java
    • 资产
    • RES
  • 模块2

    • 清单
    • 的java
    • 资产
    • RES
  • ...

基本上我想要做的是有选择地包括这些module1module2,以便我可以决定在构建时要包含哪些模块。

我已经通过添加

实现了这一目标

compile project(:module1)到build.gradle

并按如下方式设置settings.gradle文件:

include ':app', ':module1'

但这是真正的问题:老实说,我不知道为什么要修改这两个文件。

从技术上讲,build.gradle文件描述了模块之间的依赖关系,这意味着如果我包含:module1,这并不意味着我在构建中包含了这个吗?

有没有办法对单个文件进行更改,它会处理所有内容,而不是更新这两个文件?

1 个答案:

答案 0 :(得分:1)

您可以使settings.gradle文件动态化,然后项目只需要处于可预测的路径中。将来要包含一个新项目,您只需创建文件夹结构并添加build.gradle文件。

$ cat settings.gradle

// search for directories at the same level as the `settings.gradle` file
def moduleDirs = settingsDir.listFiles(new FileFilter() {
    @Override
    boolean accept(File pathname) {
        // if is a directory and directory contains a `build.gradle` file add to `moduleDirs` list
        return pathname.isDirectory() && pathname.listFiles(new FileFilter() {
            @Override
            boolean accept(File file) {
                return file.name == 'build.gradle'
            }
        }).size() == 1
    }
})
// now that we know all the modules create a project for each
// modules will define their own relationship (in their `build.gradle`)
// here we just declare the name and location of each
for (def moduleDir : moduleDirs) {
    include ":$moduleDir.name"
    project(":$moduleDir.name").projectDir = moduleDir
}

不是一个单独的文件解决方案,但您现在无需再次触摸settings.gradle

将来,如果有人想要建立消费者,他们可以依赖构建的jar输出(即maven repo存储的jar)或将他们的项目添加到文件结构中。从那里,他们可以像往常一样选择build.gradle

中依赖的项目

projectA/build.gradle:包含projectA && projectB但不包含projectC..projectZ

// ...
dependencies {
    compile project(':projectB')
}

projectC/build.gradle:包含projectC && projectZprojectA || projectB

// ...
dependencies {
    compile project(':projectZ')
}