如何从非 build-gradle 文件访问 Kotlin DSL 扩展?

mus*_*off 5 gradle maven gradle-kotlin-dsl kotlin-dsl gradle-kts

很少有 Kotlin 扩展带有org.gradle.kotlin.dsl类似 androidpublishing等。比如说, for 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)
Run Code Online (Sandbox Code Playgroud)

这意味着在我的范围内build.gradle.kts我可以打电话

publishing {
    // blablabla
}
Run Code Online (Sandbox Code Playgroud)

就我而言,我有一个单独的文件来处理定义为的发布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

Run Code Online (Sandbox Code Playgroud)

事实上,LibraryExtension也是不可访问的。

那么,如何将这些扩展传递导入random.gradle.kts到我的?

Dan*_*ugh 0


    //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
                  }
                }
              }
            }
          }
        }
      }
    }

Run Code Online (Sandbox Code Playgroud)