我有一个运行正常的 Gradle 7.2 自定义插件。我想将其配置为使用新的 Gradle 版本目录来获取依赖信息。我知道如何配置和使用版本目录,并为我们的共享依赖项生成了一个共享 jar。它正在被其他一些版本读取,没有任何问题。
但是,我似乎找不到插件在设置依赖项时使用版本目录 jar 的正确咒语。我不断收到“‘VersionCatalogsExtension’类型的扩展不存在”。
以下两个片段显示了我在 apply 方法中访问版本目录所做的操作:
override fun apply(project: Project) {
val libs = project
.extensions
.getByType(VersionCatalogsExtension::class.java)
.named("libs")
addBuildDependencies(libs)
.
.
.
private fun Project.addBuildDependencies(libs: VersionCatalog) {
dependencies.apply {
// BOMs
add(JavaPlugin.IMPLEMENTATION_CONFIGURATION_NAME, platform(libs.findDependency("arrow.bom").get()))
add(JavaPlugin.IMPLEMENTATION_CONFIGURATION_NAME, platform(libs.findDependency("detekt.bom").get()))
如果有任何片段或重定向,我将不胜感激。
谢谢, 迈克
您如何应用该插件?
我注意到,如果您尝试从
allProjects
或 subprojects
块执行此操作,它不起作用,它会失败并出现以下错误:
Extension of type 'VersionCatalogsExtension' does not exist. Currently registered extension types: ...
我认为这与我们不能直接在这些块中使用
libs
的原因相同,请参阅此评论了解更多详细信息。
解决方案是直接在将使用它的项目中引用自定义插件并避免交叉配置。
出现“
VersionCatalogsExtension
类型扩展不存在”的可能原因之一是应用插件的目标项目在其settings.gradle
文件中没有所需的版本目录声明。即使您在环境中正确配置了所需的版本目录,也不意味着实际应用插件的环境中将存在相同的目录。
换句话说,分布式插件中不会包含任何版本目录,即使它们是在开发过程中在
settings.gradle
中声明的。这些版本目录绑定到特定的 Gradle buildscript 项目环境。
至少有 3 种可能的解决方案:
versionCatalogs { ... }
配置中链接它(通过 settings.gradle
部分)。您可以拥有一个定义版本目录的设置插件,并告诉您的消费者应用该设置插件来获取相应的版本目录。
build.gradle.kts
:plugins {
id("org.jetbrains.kotlin.jvm")
id("io.github.andrew-k-21-12.version-catalogs-generator")
`java-gradle-plugin`
}
// Generating Kotlin sources for required version catalogs.
versionCatalogsGenerator {
packageName.set("com.somepackage.versions")
catalogs {
register("KotlinVersionCatalog") {
path.set("../dependencies/kotlin.toml")
}
}
}
kotlin {
sourceSets {
// Including the generated version catalogs into the sources.
main.get().kotlin.srcDir(versionCatalogsGenerator.codeGenerationTask)
}
}
gradlePlugin {
plugins {
create("your-plugin-declaration") {
// ...
}
}
}
在插件代码中:
internal class SomePlugin : Plugin<Project> {
override fun apply(target: Project) {
val catalog = KotlinVersionCatalog()
target.dependencies.add("implementation", catalog.libraries.commonsIo.fullNotation)
}
}
请确保将此代码块添加到 settings.gradle.kts 文件中
enableFeaturePreview("VERSION_CATALOGS")
// == Define locations for components ==
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
gradlePluginPortal()
}
versionCatalogs {
create("libs") {
from(files("PATH/libs.versions.toml"))
}
}
}