添加对要在项目中任何地方使用的 Gradle 插件的依赖项
// ./buildSrc/build.gradle.kts
plugins {
`kotlin-dsl` // this will create our Gradle convention plugins
// don't add the Kotlin JVM plugin
// kotlin("jvm") version embeddedKotlinVersion
// Why? It's a long story, but Gradle uses an embedded version of Kotlin,
// (which is provided by the `kotlin-dsl` plugin)
// which means importing an external version _might_ cause issues
// It's annoying but not important. The Kotlin plugin version below,
// in dependencies { }, will be used for building our 'main' project.
// https://github.com/gradle/gradle/issues/16345
}
val kotlinVersion = "1.6.20"
dependencies {
implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion")
}
请注意,我使用了Maven 仓库Kotlin Gradle 插件的坐标,而不是插件 ID!
如果愿意,您还可以将其他依赖项添加到 ./buildSrc/build.gradle.kts 中。如果你想在构建脚本中解析 JSON,那么添加对 JSON 解析器的依赖,比如kotlinx-serialization。
2.创建一个约定插件
创建您可以应用于任何 Kotlin JVM 子项目的 Kotlin JVM 约定。
// ./buildSrc/src/main/kotlin/my/project/convention/kotlin-jvm.gradle.kts
package my.project.convention
plugins {
kotlin("jvm") // don't include a version - that's provided by ./buildSrc/build.gradle.kts
}
dependencies {
// you can define default dependencies, if desired
// testImplementation(kotlin("test"))
}
kotlin {
jvmToolchain {
check(this is JavaToolchainSpec)
languageVersion.set(JavaLanguageVersion.of(11))
}
}
}
不要忘记添加 package 声明!我已经忘记了几次,它会导致难以弄清楚的错误。
3.应用约定插件
就像 Gradle 插件有 ID 一样,我们的约定插件也是如此。它是包名 + .gradle.kts 之前的位。所以在我们的例子中,ID 是my.project.convention.kotlin-jvm
我们可以像普通的 Gradle 插件一样应用它……
// ./subprojects/my-project/build.gradle.kts
plugins {
id("my.project.convention.kotlin-jvm")
}
(约定插件也可以导入其他约定插件,使用id("..."))
此外,由于我们使用的是 Kotlin,因此还有一种更好的方法。您知道如何包含 Gradle 插件,例如 java 和 java-library。我们可以用同样的方式导入我们的约定插件!
// ./subprojects/my-project/build.gradle.kts
plugins {
// id("my.project.convention.kotlin-jvm")
my.project.convention.`kotlin-jvm` // this works just like id("...") does
}
请注意插件 ID 周围的反引号 - 由于连字符,它们是必需的。
(警告:这种非id("...")方式在buildSrc内部不起作用,仅在主项目中有效)
结果
现在根./build.gradle.kts可以保持真正的干净整洁——它只需要定义项目的组和版本。
因为我们使用的是约定插件而不是笼统的subprojects,所以每个子项目都可以专门化,只导入它需要的约定插件,而不会重复。
站点说明:在buildSrc 和主项目之间共享存储库
通常你想在buildSrc 和主项目之间共享存储库。因为 Gradle 插件不是专门针对项目的,所以我们可以为任何东西写一个插件,包括settings.gradle.kts!
我所做的是创建一个包含我想使用的所有存储库的文件......
// ./buildSrc/repositories.settings.gradle.kts
@Suppress("UnstableApiUsage") // centralised repository definitions are incubating
dependencyResolutionManagement {
repositories {
mavenCentral()
jitpack()
gradlePluginPortal()
}
pluginManagement {
repositories {
jitpack()
gradlePluginPortal()
mavenCentral()
}
}
}
fun RepositoryHandler.jitpack() {
maven("https://jitpack.io")
}
(名称 repositories.settings.gradle.kts 并不重要 - 但将其命名为 *.settings.gradle.kts 应该意味着 IntelliJ 会提供建议,但目前存在漏洞。)
然后我可以将其作为插件导入其他 settings.gradle.kts 文件中,就像您将 Kotlin JVM 插件应用于子项目一样。
// ./buildSrc/settings.gradle.kts
apply(from = "./repositories.settings.gradle.kts")
// ./settings.gradle.kts
apply(from = "./buildSrc/repositories.settings.gradle.kts")