如何使用 Kotlin DSL 有选择地应用一些插件以及使用 gradle 和 android 的插件块

Dan*_*ico 2 gradle kotlin gradle-kotlin-dsl

我想选择性地应用一些插件来缩短开发时间的构建时间。

我的意思是我有这个:

app/gradle.build.kts

plugins {
    id("com.android.application")
    id("com.google.firebase.crashlytics")
}
Run Code Online (Sandbox Code Playgroud)

但我不想一直应用 firebase crashlytics 插件(以及其他插件,如性能监视器),但如果我尝试访问块project的内部,plugins我会得到:

plugins {
    id("com.android.application")

    if (!project.hasProperty("build_fast")) {
        id("com.google.firebase.crashlytics")
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到:

'val Build_gradle.project: Project' can't be called in this context by implicit receiver. Use the explicit one if necessary
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

  1. 我可以访问系统环境变量,System.getenv("CI")但从 android studio 替换这些值目前对我来说有点麻烦,有人可以展示一种更新这些变量的方法吗?

  2. 我该如何使用 来做到这一点project.hasPropperty("")

Fra*_*teo 6

你不能。插件 DSL 限制了您可以做什么和不能做什么。这记录在插件 DSL 的限制中。

要有条件地应用插件,您必须使用Project.apply(T)

plugins {
    id("com.android.application")
    id("com.google.firebase.crashlytics") apply false
}
Run Code Online (Sandbox Code Playgroud)

apply false是必要的,因为我们不想应用该插件,但我们想要该插件可用的类型或类,以便我们可以以类型安全的方式以编程方式应用该插件。

import com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsPlugin

plugins {
    id("com.android.application")
    id("com.google.firebase.crashlytics") apply false
}

apply<CrashlyticsPlugin>()
Run Code Online (Sandbox Code Playgroud)

我可以访问系统环境变量,System.getenv("CI")但从 android studio 替换这些值目前对我来说有点麻烦,有人可以展示一种更新这些变量的方法吗?

您无法更新环境 ( System.getenv()),它是不可修改的地图。

我怎样才能做到这一点project.hasPropperty("")

将其用作您已完成的条件:

import com.google.firebase.crashlytics.buildtools.gradle.CrashlyticsPlugin

plugins {
    id("com.android.application")
    id("com.google.firebase.crashlytics") apply false
}

if (!hasProperty("build_fast")) {
    apply<CrashlyticsPlugin>()
}
Run Code Online (Sandbox Code Playgroud)