使用IntelliJ IDEA构建Gradle多模块的正确结构

时间:2018-01-15 19:59:08

标签: intellij-idea gradle kotlin

我有一个Kotlin项目,它由三个模块组成:

Core < Service < Web

结构是:

build.gradle
core/
    build.gradle
service/
    build.gradle
web/
    build.gradle

build.gradle文件的结构是:

buildscript {
    ext.kotlin_version = '1.1.60'
    repositories {
        mavenCentral()
        jcenter()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}
subprojects {
    apply plugin: 'kotlin'
    apply plugin: 'jacoco'
    compileKotlin {
        kotlinOptions.jvmTarget = '1.8'
    }
    repositories {
        mavenCentral()
        jcenter()
    }
}

单个构建文件看起来像(core):

dependencies {
    // Kotlin
    compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
    ...
}

对于service(注意唯一的区别是项目依赖性):

dependencies {
    compile project (':core')
    // Kotlin
    compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version"
    ...
}

我想做一些优化,但我还在学习Gradle,并且无法找到重组事情的正确方法。 我遇到的问题是:

  1. 我无法单独构建serviceweb,因为他们抱怨无法找到他们的从属子项目。 (例如,通过gradle build目录中的service/。)

  2. 如何在根级别定义Kotlin stdlib-jre8依赖关系,以便在我的三个构建文件中不重复?

  3. root buildfile 的子项目/ buildscript任务如何使用相同的存储库定义,以便我不必定义mavenCentral()/jcenter()两次?

  4. 基本上我的构建结构是通过一些实验/网络资源拼凑在一起的,而恰好主要是工作,但是我想要以正确的方式做一些指导,例如(1)它遵循良好的Gradle实践,(2)通过自动导入到IDEA仍然有效。

1 个答案:

答案 0 :(得分:2)

  1. 如果您想在模块上运行构建,可以运行:gradle :web:build
  2. 与在subprojects子句中添加存储库的方式相同,您可以在其中添加dependencies块。确保只有共享依赖项。例如,compile project(':core')应仅在相关项目中。可以有多个dependency块。也就是说,使用subproject子句通常更令人头疼。因为,如果其中一个模块的依赖关系发生变化,则您必须为所有模块更新
  3. 关于repository定义,它们非常不同。 Gradle本身使用buildscript块中的那个来查找插件和其他“预构建”要求。子模块上的一个用于查找给定模块中源代码的依赖关系。如前所述,当放置在相应的模块构建脚本上时,它更容易管理。
  4. 更新

    如果你想为所有模块保留相同的版本,那么应该也可以从子模块中访问buildcript中ext上定义的变量:ext.kotlin_version = '1.1.60'如果你有多个模块你可以可以添加它们像:

    ext {
      kotlin_version = '1.1.60'
      junit_version = '4.12'
    }
    

    此外,如果您想在模块之间共享代码,您始终可以将其提取到gradle文件并使用以下方式加载到需要的地方:apply file: "$rootDir/path/to/script.gradle"

    关于#3,我会给你一个实际的例子。

    Google拥有自己的maven存储库,其中包含Android模块的所有依赖项。如果你有一个包含服务器端模块和android模块的项目,你可能不需要服务器端查找Gradle artefact存储库的依赖项(artefact是jar依赖项的名称)。

    对于buildscript存储库,在您的情况下,您只加载一个位于mavenCentral()的类路径(预构建)依赖项,因此您可以在此处删除jcenter()