代码之家  ›  专栏  ›  技术社区  ›  musooff

如何从非构建gradle文件访问Kotlin DSL扩展?

  •  0
  • musooff  · 技术社区  · 6 年前

    附带的Kotlin扩展很少 org.gradle.kotlin.dsl 喜欢 android 或 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 并且位于完全随机的目录中。

    在这里,我想访问这个 出版业 扩展,但无法做到。

    欢迎提出任何建议。

    再举一个例子 安卓 也无法访问。 在我的 build.gradle.kts 我可以访问 安卓 但在我的 random.gradle.kts 我做不到。

    安卓 扩展定义如下

    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 ?

    0 回复  |  直到 6 年前
        1
  •  0
  •   Dan Brough    5 年前
    
        //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
                      }
                    }
                  }
                }
              }
            }
          }
        }