如何从非 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 扩展很少,例如 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

【问题讨论】:

【参考方案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 扩展?的主要内容,如果未能解决你的问题,请参考以下文章

如何从非托管 C++ 代码获取结构化列表值到 C#?

从非本地网络访问服务器数据,无需端口转发

使用 COM 互操作从非托管 C++ 访问 c# 属性

从非托管 C++ 调用 WCF 服务会导致访问冲突

从非托管 C 库访问 C# 方法是不是安全? [关闭]

从非 Microsoft 客户端访问 WCF 服务回调