【问题标题】:How to access Kotlin DSL extensions from non-build-gradle file?如何从非 build-gradle 文件访问 Kotlin DSL 扩展?
【发布时间】:2020-12-29 14:38:32
【问题描述】:

org.gradle.kotlin.dsl 附带的 Kotlin 扩展很少,例如 androidpublishing 等。比如说,对于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

【问题讨论】:

    标签: maven gradle gradle-kotlin-dsl kotlin-dsl 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
                      }
                    }
                  }
                }
              }
            }
          }
        }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-11
      • 2015-04-02
      相关资源
      最近更新 更多