【问题标题】:How to apply explicit API mode to all modules except the app module?如何将显式 API 模式应用于除 app 模块之外的所有模块?
【发布时间】:2023-04-05 15:42:01
【问题描述】:

我喜欢将explicit API mode 应用于this Android project 中的所有模块除了 应用于app 模块。通过将以下配置添加到每个模块的 build.gradle 文件中,这可以正常工作。

// build.gradle of a module

kotlin {    
    explicitApi() 
}

我喜欢避免重复声明。因此,我的目标是在 project root 中的 build.gradle 文件中配置它。我尝试了以下方法:

// build.gradle in project root

allprojects {
    apply plugin: "kotlin"
    kotlin {
        if (project.name != "app") {
            explicitApi()
        }
    }
}

这与模块中的插件定义冲突:

原因:org.gradle.api.internal.plugins.PluginApplicationException:无法应用插件“kotlin-android”。
原因:java.lang.IllegalArgumentException:无法添加名为“kotlin”的扩展,因为已经使用该名称注册了一个扩展。
原因:com.android.build.gradle.internal.BadPluginException:“java”插件已应用,但与Android插件不兼容。

相关

【问题讨论】:

    标签: android kotlin gradle groovy kotlin-gradle-plugin


    【解决方案1】:

    您的build.gradle 在子项目应用 Android 插件之前将 Kotlin 插件应用于子项目,这不起作用 - 它需要反过来。

    尝试将操作推迟到项目评估完成后,例如

    gradle.afterProject { project ->
        if (project.name == "app") return
        project.extensions.findByName("kotlin")?.explicitApi()
    }
    

    【讨论】:

    • 谢谢。如果我理解正确,这与Gradle#projectsEvaluated(Closure) 的作用相同,其优势在于Gradle#afterProject(Closure) 提供对project 参数的访问。
    • @JJD projectsEvaluated 在评估所有项目后调用其关闭一次。 afterProject 在评估每个项目后立即调用其关闭。 projectsEvaluated { allprojects { ... } }afterProject {... }相似,但并不完全相同。
    猜你喜欢
    • 2013-03-07
    • 2014-07-02
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 2020-06-27
    • 2014-05-19
    • 1970-01-01
    • 2016-10-08
    相关资源
    最近更新 更多