约定插件错误org.gradle.accessors.dm.LibrariesForDeps不存在

i86rm4rw  于 2023-01-31  发布在  其他
关注(0)|答案(1)|浏览(223)

我正在尝试为一个公共配置构建约定插件,例如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")
qnakjoqk

qnakjoqk1#

使用libs在约定插件中不起作用,但在此问题中有一些解决方法:https://github.com/gradle/gradle/issues/15383
但我认为您不需要它,相反,可以在一个位置定义版本:包含的构建版本的build.gradle.kts,它可以访问版本目录DSL。
1.在libs.versions.toml中定义ktlint插件的 * Maven * 坐标

[libraries]

gradlePlugin-ktlint = { module = "org.jlleitschuh.gradle:ktlint-gradle", version = "11.1.0" }

我更喜欢在这样的依赖项前面加上gradlePlugin,以区别于"常规"项目依赖项。
(The Maven坐标列在the Gradle Plugin Portal中,在"遗留"应用程序下作为classpath依赖项)
1.在包含的构建版本build-configuration/build.gradle.kts中添加对ktlint的依赖项

plugins {
  `kotlin-dsl`
}

dependencies {
  implementation(libs.deps.gradlePlugin.ktlint)
}

1.现在,ktlint插件将在类路径上可用,您可以像在常规插件中一样应用它,而不需要版本。
在预编译脚本插件中:

// ./build-configuration/src/main/kotlin/my-ktlint-convention.gradle.kts

plugins {
  id("org.jlleitschuh.gradle.ktlint") // version is provided by build.gradle.kts
}

或者在传统的类插件中(需要通过gradlePlugins {}注册):

// ./build-configuration/src/main/kotlin/KtlintConventionPlugin.kt
class KtlintConventionPlugin : Plugin<Project> {
  override fun apply(target: Project) {
    target.apply(plugin = "org.jlleitschuh.gradle.ktlint")
    target.extensions.configure<KtlintExtension> {
         // ...
    }
  }
}

另请参见

有关buildSrc约定插件的详细信息,请参阅以下相关答案:

相关问题