我们有一个现有的插件项目,它配置各种内容(包括静态分析),我们希望将插件应用到项目本身。
当前适用于用 Java 编写的插件的方式是,将 Java src 目录添加到 buildSrc
项目中,然后可以在主项目中使用在那里构建的类。所以我试图让同样的事情适用于以 Kotlin 脚本编写的插件。
但是当我尝试构建它时,编译 buildSrc
失败并显示:
e: C:\Users\Trejkaz\Documents\test\self-applying-gradle-plugin\src\main\kotlin\example.common.gradle.kts: (1, 1): Unresolved reference: allprojects
> Task :buildSrc:compileKotlin FAILED
要完成这项工作还缺少什么?
进一步调查:
- 如果我将文件的副本放入
buildSrc/src/main/kotlin
中,就可以了。 - 如果我将文件的副本放入
buildSrc/src/main/kotlin2
中并使用srcDirs
设置该目录,也会失败。所以看起来确实有什么东西根本不允许我重新定位源。
我推了a repo to play with this here但接下来是构建脚本的内容,以防它被删除。
主要的build.gradle.kts
:
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
`java-gradle-plugin`
`kotlin-dsl`
// Matching version in Gradle
kotlin("jvm") version "1.5.31"
}
apply(from = "common-build.gradle.kts")
apply(plugin = "example.common") // 👈 trying to apply the compiled plugin here
group = "org.example"
version = "1.0-SNAPSHOT"
tasks.withType<KotlinCompile> {
kotlinOptions.jvmTarget = "11"
}
在 buildSrc/build.gradle.kts
中,我们有这个 - 请注意,它为主目录中的源代码添加了一个源目录:
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
`java-gradle-plugin`
`kotlin-dsl`
// Matching version in Gradle
kotlin("jvm") version "1.5.31"
}
apply(from = "../common-build.gradle.kts")
tasks.withType<KotlinCompile> {
kotlinOptions.jvmTarget = "11"
}
kotlin {
sourceSets["main"].kotlin.srcDir("../src/main/kotlin")
}
common-build.gradle.kts
具有两个构建脚本共有的所有内容,我们已经弄清楚如何移动到公共(public)位置(值得注意的是,KotlinCompile
是不在那里,稍后我会弄清楚为什么我也不能移动它):
repositories {
mavenCentral()
}
dependencies {
// Needed to compile Kotlin stuff but not added by the plugin for some reason
"implementation"("org.jetbrains.kotlin:kotlin-scripting-jvm")
}
插件脚本 src/main/kotlin/example.common.gradle.kts
包含:
allprojects {
// Configure something
}
最佳答案
结果是a bug in Gradle's kotlin-dsl plugin .
解决方法是在应用插件之前添加源目录。
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
`java-gradle-plugin`
`kotlin-dsl` apply false
// Matching version in Gradle
kotlin("jvm") version "1.5.31"
}
apply(from = "../common-build.gradle.kts")
tasks.withType<KotlinCompile> {
kotlinOptions.jvmTarget = "11"
}
kotlin {
sourceSets["main"].kotlin.srcDir("../src/main/kotlin")
}
// Workaround for https://github.com/gradle/gradle/issues/21052 -
// apply kotlin-dsl plugin last, because it erroneously fetches source dirs eagerly.
apply(plugin = "org.gradle.kotlin.kotlin-dsl")
关于kotlin - 如何使用 Kotlin DSL 将插件应用到自身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72568509/