我正在尝试为一个公共配置构建约定插件,例如ktlint。它们存储在build-configuration/plugin/convention下。
class KtlintConventionPlugin : Plugin<Project> {
override fun apply(target: Project) {
return with(target) {
pluginManager.apply(deps.plugins.ktlint.get().pluginId)
extensions.configure<KtlintExtension> {
// ...
}
}
}
}
构建配置/插件/约定/build.gradle.kts
plugins {
`kotlin-dsl`
}
group = "com.example"
dependencies {
compileOnly(deps.kotlin.jvm.gradle.plugin)
compileOnly(deps.ktor.gradle.plugin)
compileOnly(deps.ktlint.gradle.plugin)
compileOnly(files(deps.javaClass.superclass.protectionDomain.codeSource.location))
}
gradlePlugin {
plugins {
register("ktlint-plugin") {
id = "ktlint-plugin"
implementationClass = "KtlintConventionPlugin"
}
}
}
我还有一个扩展函数,用于获取build-configuration/plugin/convention/src/main/Kotlin/com/example/VersionCatalog.kt中TOML文件(存储在gradle/deps.versions.toml
中)中定义的依赖项
import org.gradle.accessors.dm.LibrariesForDeps
import org.gradle.api.Project
import org.gradle.kotlin.dsl.the
internal val Project.deps: LibrariesForDeps
get() = the()
构建配置/设置.gradle.kts
dependencyResolutionManagement {
repositories {
gradlePluginPortal()
mavenLocal()
mavenCentral()
}
versionCatalogs {
create("deps") {
from(files("../gradle/deps.versions.toml"))
}
}
}
rootProject.name = "build-configuration"
include(":plugin:convention")
当我在根build.gradle.kts
中包含ktlint
插件时,Gradle同步始终失败。
An exception occurred applying plugin request [id: 'ktlint-plugin']
> Failed to apply plugin 'ktlint-plugin'.
> Type org.gradle.accessors.dm.LibrariesForDeps not present
我可以看到在.gradle/.../LibrariesForDeps中生成的类,但在项目的根目录下,而不是插件的根目录下。
整个构建配置模块包含在root settings.gradle.kts中:
includeBuild("build-configuration")
1条答案
按热度按时间qnakjoqk1#
使用
libs
在约定插件中不起作用,但在此问题中有一些解决方法:https://github.com/gradle/gradle/issues/15383但我认为您不需要它,相反,可以在一个位置定义版本:包含的构建版本的
build.gradle.kts
,它可以访问版本目录DSL。1.在
libs.versions.toml
中定义ktlint插件的 * Maven * 坐标我更喜欢在这样的依赖项前面加上
gradlePlugin
,以区别于"常规"项目依赖项。(The Maven坐标列在the Gradle Plugin Portal中,在"遗留"应用程序下作为
classpath
依赖项)1.在包含的构建版本
build-configuration/build.gradle.kts
中添加对ktlint的依赖项1.现在,ktlint插件将在类路径上可用,您可以像在常规插件中一样应用它,而不需要版本。
在预编译脚本插件中:
或者在传统的类插件中(需要通过
gradlePlugins {}
注册):另请参见
有关buildSrc约定插件的详细信息,请参阅以下相关答案: