我有一个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
,因为他们抱怨无法找到他们的从属子项目。 (例如,通过gradle build
目录中的service/
。)
如何在根级别定义Kotlin stdlib-jre8
依赖关系,以便在我的三个构建文件中不重复?
root buildfile 的子项目/ buildscript任务如何使用相同的存储库定义,以便我不必定义mavenCentral()/jcenter()
两次?
基本上我的构建结构是通过一些实验/网络资源拼凑在一起的,而恰好主要是工作,但是我想要以正确的方式做一些指导,例如(1)它遵循良好的Gradle实践,(2)通过自动导入到IDEA仍然有效。
答案 0 :(得分:2)
gradle :web:build
subprojects
子句中添加存储库的方式相同,您可以在其中添加dependencies
块。确保只有共享依赖项。例如,compile project(':core')
应仅在相关项目中。可以有多个dependency
块。也就是说,使用subproject
子句通常更令人头疼。因为,如果其中一个模块的依赖关系发生变化,则您必须为所有模块更新repository
定义,它们非常不同。 Gradle本身使用buildscript
块中的那个来查找插件和其他“预构建”要求。子模块上的一个用于查找给定模块中源代码的依赖关系。如前所述,当放置在相应的模块构建脚本上时,它更容易管理。如果你想为所有模块保留相同的版本,那么应该也可以从子模块中访问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()
。