我有一个函数可以替代
mavenCentral
,它创建一个 ArtifactRepository:
fun RepositoryHandler.myCustomRepository(): ArtifactRepository {
// about 20 lines of code
}
我有一个多项目 Gradle 构建,它也有一个
buildSrc
,我想要
使用myCustomRepository
:
buildSrc
我发现最好的方法是使用
settings.gradle.kts
和
buildSrc/settings.gradle.kts
并在四个地方使用该函数:
不幸的是, 看来我还需要define该函数的四个相同的副本, 每个
settings.gradle.kts
文件中有两个。我连一个地方都找不到
定义它对我需要使用它的所有四个位置都可见。
即:
settings.gradle.kts
fun RepositoryHandler.myCustomRepository(): ArtifactRepository {
// copy #1
}
pluginManagement {
fun RepositoryHandler.myCustomRepository(): ArtifactRepository {
// copy #2
}
repositories {
myCustomRepository()
gradlePluginPortal()
}
}
dependencyResolutionManagement {
repositories {
myCustomRepository()
}
}
buildSrc/settings.gradle.kts
fun RepositoryHandler.myCustomRepository(): ArtifactRepository {
// copy #3
}
pluginManagement {
fun RepositoryHandler.myCustomRepository(): ArtifactRepository {
// copy #4
}
repositories {
myCustomRepository()
gradlePluginPortal()
}
}
dependencyResolutionManagement {
repositories {
myCustomRepository()
gradlePluginPortal()
}
}
有没有办法只在ONE地方定义这个函数,并在 这四个地方都是吗?
pluginManagement
很特别您不能简单地在
pluginManagement
块中使用外部函数,因为 pluginManagement
与 plugins
块一样,与文件的其余部分1 隔离,因此没有导入机制。
您可以做的替代方案是在
包含的构建中编写一个
Settings
插件。这样的设置插件本身可以在 pluginManagement
内执行操作,包括调用给定的函数。
此外,设置插件在应用于
plugins
块内时,会将其 JAR 添加到 settings.gradle.kts
文件的类路径中,以便您可以使用该文件中插件项目中定义的任何其他函数(尽管不是 pluginManagement
) .
总而言之,看起来像这样:
包含一个构建项目,它使用 Java Gradle 插件定义和导出设置插件,并声明您的函数
myCustomRepository()
。这是关键源文件:
// myIncludedBuild/src/main/kotlin/MySettingsPlugin.kt
class MySettingsPlugin : Plugin<Settings> {
override fun apply(target: Settings) {
target.pluginManagement.apply {
repositories.myCustomRepository()
}
}
}
fun RepositoryHandler.myCustomRepository() {
println(this::class.qualifiedName)
}
然后在主项目的
settings.gradle.kts
中你可以做:
pluginManagement {
includeBuild("myIncludedBuild")
}
plugins {
// Calls myCustomRepository via its apply method
id("mySettingsPlugin")
}
dependencyResolutionManagement {
repositories.myCustomRepository()
}
buildSrc
的 settings.gradle.kts
是相同的,只是它需要稍微不同的相对路径来查找包含的构建:
pluginManagement {
includeBuild("../myIncludedBuild")
}
执行该构建,您将获得以下输出四次:
org.gradle.api.internal.artifacts.dsl.DefaultRepositoryHandler_Decorated
build.gradle.kts
文件中使用现在您已经有了一个包含的构建,您可以使用
Project
插件以类似的方式继续,或者直接使用 buildscript
块将包含的构建项目的代码添加到任何给定的 build.gradle.kts
文件中。