Gradle7版本目录:如何与buildSrc一起使用?

A B*_*elp 35 gradle build.gradle gradle-plugin gradle-kotlin-dsl

我对正在孵化的 Gradle 版本目录感到非常兴奋,并且一直在尝试它。I\xe2\x80\x99ve 发现我的信息可以在我的应用程序和 utility-lib 项目的脚本gradle/libs.versions.toml中访问。build.gradle.kts

\n

但是,我无法使用该toml文件的内容buildSrc/build.gradle.kts约定文件

\n

我可以构建的唯一方法是将依赖项硬编码到这些文件中,就像我在版本目录功能之前所做的那样。

\n

在该buildSrc文件夹中,我创建了一个settings.gradle.kts文件并插入了 的dependencyResolutionManagement代码versionCatalogs,该代码指向与我的应用程序和 utility-lib 项目相同的文件。

\n

根据 Gradle7文档,似乎可以与 和 模块共享版本目录\xe2\x80\xa6 I\xe2\x80\x99d如果可能的buildSrc话,希望能够推动它与 一起工作。buildSrc

\n

这是一个简单的示例项目,我通过以下方式创建gradle initmy-version-catalog

\n

感谢您的时间和帮助,

\n

麦克风

\n

Bri*_*ice 45

使用 Gradle 7.3.3,这是可能的。注意版本目录自 Gradle 7.4 起为 GA

该代码片段假设 Gradle 至少为 7.4,但如果您需要该版本之前的它们,请enableFeaturePreview("VERSION_CATALOGS")在每个settings.gradle.kts.

使用buildSrc

buildSrc/settings.gradle.kts

dependencyResolutionManagement {
    versionCatalogs {
        create("libs") {
            from(files("../gradle/libs.versions.toml"))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

buildSrc/build.gradle.kts

dependencies {
    implementation(libs.gradleplugin.intellij) // <- the lib reference
}
Run Code Online (Sandbox Code Playgroud)

您甚至可以使用插件的版本目录

gradle/libs.versions.toml

...

[plugins]
kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
jetbrains-changelog = { id = "org.jetbrains.changelog", version.ref = "changelog-plugin" }
jetbrains-intellij = { id = "org.jetbrains.intellij", version.ref = "intellij-plugin" }
hierynomus-license = { id = "com.github.hierynomus.license", version.ref = "license-plugin" }
nebula-integtest = { id = "nebula.integtest", version.ref = "nebula-integtest-plugin" }
Run Code Online (Sandbox Code Playgroud)

build.gradle.kts

plugins {
    id("java")
    alias(libs.plugins.kotlin.jvm)
    alias(libs.plugins.nebula.integtest)
    alias(libs.plugins.jetbrains.intellij)
    alias(libs.plugins.jetbrains.changelog)
    alias(libs.plugins.hierynomus.license)
}
Run Code Online (Sandbox Code Playgroud)

注意在脚本中访问目录,请参考下面的部分,技巧是一样的。

使用约定插件包含的构建

在主项目中包括一个包含约定插件的 Gradle 项目。

build.gradle.kts

includeBuild("convention-plugins") // here it's a subfolder
Run Code Online (Sandbox Code Playgroud)

convention-plugins/settings.gradle.kts

dependencyResolutionManagement {
    repositories {
        gradlePluginPortal()
    }
    versionCatalogs {
        create("libs") {
            from(files("../gradle/libs.versions.toml"))
        }
    }
}

rootProject.name = "convention-plugins"
Run Code Online (Sandbox Code Playgroud)

启用约定插件访问版本目录的技巧分为两部分,添加一个丑陋的实现依赖项来定位版本目录生成的类所在的位置。

libs.javaClass.superclass.protectionDomain.codeSource.location
Run Code Online (Sandbox Code Playgroud)

然后在约定插件中通过引用libs 扩展Project::the

val libs = the<LibrariesForLibs>()
Run Code Online (Sandbox Code Playgroud)

这是由gradle/gradle#15383跟踪的。

convention-plugins/build.gradle.kts

plugins {
    `kotlin-dsl`
}

dependencies {
    implementation(libs.gradleplugin.kotlin.jvm)

    // https://github.com/gradle/gradle/issues/15383
    implementation(files(libs.javaClass.superclass.protectionDomain.codeSource.location))
}
Run Code Online (Sandbox Code Playgroud)

在实际的约定插件中

import org.gradle.accessors.dm.LibrariesForLibs

plugins {
    id("org.jetbrains.kotlin.jvm")
}

// https://github.com/gradle/gradle/issues/15383
val libs = the<LibrariesForLibs>()

dependencies {
    detektPlugins(libs.bundles.kotlinStuff) // access catalog entries
}
Run Code Online (Sandbox Code Playgroud)

该类org.gradle.accessors.dm.LibrariesForLibs由 gradle 生成,位于本地 gradle 文件夹中的某个位置./gradle/<version>/dependency-accessors/<hash>/classes


请注意,尽管依赖项已正确解析alias(libs.gradleplugin.thePlugin),但较旧的 IntelliJ IDEA 目前 (2022.3) 在编辑器中报告为错误 。由KTIJ-19369跟踪,该票证表明这实际上是 Gradle Kotlin DSL gradle/gradle#22797中的一个错误,并且有人制作了一个简单的IntelliJ IDEA 插件来隐藏此错误,直到解决为止。

  • 这并不能真正完全回答这个问题。它使目录可供 `buildSrc/build.gradle` 访问,但不适用于约定插件。您是否有使用目录扩展来引用“libs.versions.toml”内容的示例? (8认同)
  • 如果您想在用 kotlin 编写的约定插件中使用它,您还可以在 `Project` 上复制现有的 `libs` 扩展函数,例如 `val Project.libs: LibrariesForLibs get() = (this as ExtensionAware).extensions.getByName (“库”)作为 LibrariesForLibs` (3认同)
  • @GavinRay @Pytry 我也有约定插件,但我迁移到 _included build_ 而不是 `buildSrc`。我会立即用我所拥有的来补充答案。 (2认同)

归档时间:

查看次数:

12262 次

最近记录:

3 年 前