使用IntelliJ IDEA构建Gradle多模块的正确结构
我有一个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,并找不到正确的方式来重组事情。 我有的问题是:
-
我无法单独建立
service
或web
,因为他们抱怨无法find他们的从属子项目。 (例如,通过service/
目录中的gradle build
。) -
我如何在根级别定义Kotlin
stdlib-jre8
依赖项,所以它不会在我的三个构建文件中重复? -
我的subproject / buildscript任务的根构建文件如何使用相同的存储库定义,以便我不必定义
mavenCentral()/jcenter()
两次?
基本上我通过一些实验/网络资源拼凑了这个构建结构,而且大多数情况下都是工作 ,但是我想要一些正确的方法指导,例如(1)遵循良好的Gradle实践, 2)通过自动导入IDEA仍然可以正常工作。
- 如果你想运行一个模块的构建,你可以运行:
gradle :web:build
- 与在
subprojects
子句中添加存储库的方式相同,您可以在其中添加dependencies
块。 确保只有共享依赖关系在那里。 例如,compile project(':core')
只应该在相关的项目中。 可以有多个dependency
块。 也就是说,使用subproject
子句通常更令人头痛。 因为如果某个模块的依赖关系发生变化,那么你不得不更新它们 - 关于
repository
定义,它们是非常不同的。buildscript
块中的一个被Gradle自己用来查找插件和其他“预建”需求。 子模块上的模块用于查找给定模块中源代码的依赖关系。 如前所述,放置在各自的模块构建脚本上时,管理起来更容易。
更新:
如果你想保留所有模块的相同版本,buildscript中的ext
中定义的variables也应该可以从子模块访问: 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()
上的类路径(预mavenCentral()
)依赖关系,所以你可以在这里删除jcenter()
。
- IntelliJ IDEA使用Gradle构建文件中指定的依赖关系的JavaScript“版本”?
- Gradle和Realm库的编译问题
- 如何将ext。*变量转换为build.gradle.kts中的插件块
- Gradle脚本Kotlin中的锅炉项目配置
- gradle multi-project:构建目录出现在包含Kotlin artefact的根目录中
- 在多个“编译…”任务之前连接一个generateSrc gradle任务
- 没有用gradle建立kotlin项目
- 为什么Gradle构建的Kotlin源代码暂停〜3秒“强制System.gc()”?
- 在kotlin / spring引导中使用Gradle属性扩展