在Kotlin项目中使用Gradle版本目录时,如何获取带有分类器的工件?

eimct9ow  于 2023-10-19  发布在  Kotlin
关注(0)|答案(2)|浏览(140)

我试图建立一个Kotlin项目,它需要一些仅运行时依赖,但这些依赖来自分类器。
我正在使用libs.versions.toml目录文件来存储所有版本,但Gradle决定目录文件不能存储分类器信息,所以现在我正在尝试找到一种不使用目录的方法来指定它。

kotlin {
    // ...
    sourceSets {
        val jvmMain by getting {
            dependencies {
                // ...
                implementation(libs.lwjgl)
                implementation(libs.lwjgl.openvr)

                runtimeOnly(libs.lwjgl.openvr) // but want classifier = "native-windows"
            }
        }
        val jvmTest by getting
    }
}

努力到现在

1.在a Gradle ticket上,他们会说:

runtimeOnly(libs.lwjgl.openvr) {
    artifact {
        classifier = "native-windows"
    }
}

但是,这不起作用,因为runtimeOnly没有重载,它同时执行Any和配置操作。如果我以字符串的形式提供它,它就可以工作,但是我不再使用版本目录了。
1.类似的问题here会让我使用这个:

implementation(variantOf(libs.lwjgl.openvr) {
    classifier("native-windows")
})

然而,这似乎也是无效的-没有variantOf函数存在,我找不到任何地方导入它,到目前为止没有人说他们从哪里得到它。
1.然后我尝试了通常的破解方法,比如.apply{}。但是我得到的对象的类型看起来并不像是能够设置分类器的正确类型。
因此,我没有想法了,没有在另一个项目中放弃目录功能,因为它阻碍了我做任何有用的事情。
游戏中的版本:

  • Gradle 7.5.1
  • Kotlin多平台插件1.6.10
u4vypkhs

u4vypkhs1#

你尝试的两种方法都工作得很好,.,在它们存在的顶级dependencies { ... }中,以及在你从中获得它们的示例中使用它们的地方。
你的问题是,你试图在高度自定义的KotlinGradle插件特定的dependencies { ... }块中使用它们,即使在1.9.10中也没有这些功能。在顶层的dependencies { ... }块中,您可以在为其定义了这些方法的DependencyHandler上进行操作。当你尝试使用它们时,你在一个KotlinDependencyHandler上操作,它根本没有直接的支持,你应该向JetBrains抱怨。
你可以使用的是通常的变通方法,要么使用顶级依赖块,要么至少在Kotlin依赖块中使用variantOf方法。
这里有三种方法,都工作正常:

kotlin {
    jvm()
    sourceSets {
        val jvmMain by existing {
            dependencies {
                runtimeOnly(dependencies.variantOf(libs.lwjgl) { classifier("native-windows") })
            }
        }
    }
}

val jvmMainRuntimeOnly by configurations
dependencies {
    jvmMainRuntimeOnly(variantOf(libs.lwjgl) { classifier("native-windows") })
    jvmMainRuntimeOnly(libs.lwjgl) { artifact { classifier = "native-windows" } }
}
bzzcjhmw

bzzcjhmw2#

在试图解决同一问题时偶然发现了这一点。

runtimeOnly(libs.lwjgl.openvr) {
    artifact {
        classifier = "native-windows"
    }
}

我升级到Gradle 8后,这对我很有效。
也为卡普工作顺便说一句我的具体用途是:

kapt(libs.querydsl.apt) {
    artifact {
        classifier = "jpa"
    }
}

相关问题