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

标签 maven gradle gradle-kotlin-dsl kotlin-dsl gradle-kts

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)
这意味着我可以在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
                  }
                }
              }
            }
          }
        }
      }
    }

关于maven - 如何从非build-gradle文件访问Kotlin DSL扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63840844/

相关文章:

maven - 在Gradle中运行从Maven下载的Java Artifact

groovy - 在任务规则中定义任务时,如何强制运行测试任务?

android - 在根项目 buildscript 中使用复合构建中的 Gradle 插件

android - Gradle Kotlin DSL 找不到 java.io 包

java - 如何使用maven执行groovy文件?

java - 如何通过mvn命令顺序执行2个Java类

maven - 无法执行目标maven发布:prepare

android - list 同步错误

java - android 支持 v4 13.0.0 和 23.4.0 的 Gradle 依赖问题

gradle - 如何使用 Gradle Kotlin DSL 从 gradle 脚本中的单独 .gradle 文件中调用函数?