如何从非 build-gradle 文件访问 Kotlin DSL 扩展?
Posted
技术标签:
【中文标题】如何从非 build-gradle 文件访问 Kotlin DSL 扩展?【英文标题】:How to access Kotlin DSL extensions from non-build-gradle file? 【发布时间】:2020-12-29 14:38:32 【问题描述】: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)
这意味着在 mybuild.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
?
【问题讨论】:
【参考方案1】:
//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
【讨论】:
以上是关于如何从非 build-gradle 文件访问 Kotlin DSL 扩展?的主要内容,如果未能解决你的问题,请参考以下文章