问题描述
org.gradle.kotlin.dsl
随附的Kotlin扩展很少,例如
android
或publishing
等。例如,publishing
的扩展名定义如下
fun org.gradle.api.Project.`publishing`(configure: org.gradle.api.publish.PublishingExtension.() -> Unit): Unit =
(this as org.gradle.api.plugins.ExtensionAware).extensions.configure("publishing",configure)
这意味着我可以在build.gradle.kts
内致电
publishing {
// blablabla
}
就我而言,我有一个单独的文件用于处理发布,定义为random.gradle.kts
,位于完全随机的目录中。
在这里,我想访问此publishing
扩展名,但无法执行。
欢迎任何建议。
举另一个例子,android
也无法访问。
在我的build.gradle.kts
中,我可以访问android
,但在我的random.gradle.kts
中,我无法访问。
android
扩展名定义如下
val org.gradle.api.Project.`android`: com.android.build.gradle.LibraryExtension get() =
(this as org.gradle.api.plugins.ExtensionAware).extensions.getByName("android") as com.android.build.gradle.LibraryExtension
实际上,LibraryExtension也无法访问。
那么,如何传递或导入这些扩展名到我的random.gradle.kts
?
解决方法
//build.gradle.kts tested with gradle 6.7
subprojects {
afterEvaluate {
(extensions.findByType(com.android.build.gradle.LibraryExtension::class)
?: extensions.findByType(com.android.build.gradle.AppExtension::class))?.apply {
println("Found android subproject $name")
lintOptions.isAbortOnError = false
compileSdkVersion(30)
if (this is com.android.build.gradle.AppExtension)
println("$name is an application")
if (this is com.android.build.gradle.LibraryExtension) {
val publishing =
extensions.findByType(PublishingExtension::class.java) ?: return@afterEvaluate
val sourcesJar by tasks.registering(Jar::class) {
archiveClassifier.set("sources")
from(sourceSets.getByName("main").java.srcDirs)
}
afterEvaluate {
publishing.apply {
val projectName = name
publications {
val release by registering(MavenPublication::class) {
components.forEach {
println("Publication component: ${it.name}")
}
from(components["release"])
artifact(sourcesJar.get())
artifactId = projectName
groupId = ProjectVersions.GROUP_ID
version = ProjectVersions.VERSION_NAME
}
}
}
}
}
}
}
}