将 Kotlin 的 detekt 版本定义为 extra 属性 (ext)

Define Kotlin's detekt version as extra property (ext)

Groovy 允许为 ext.

中的项目定义 额外属性

我想在 groovy 的额外属性中定义 Detekt 的版本。 Detekt 是一款针对 Kotlin lang 的静态代码分析工具。

然而,当我按照以下方式进行操作时:

buildscript {
    // testing, code-style, CI-tools
    ext.detect_code_analysis = '1.0.0.RC6-3' //change to 1.0.0 when available

    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:$gradle_version"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}
plugins {
    id "io.gitlab.arturbosch.detekt" version "$detect_code_analysis"
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

detekt {
    version = "$detect_code_analysis"
    profile("main") {
        input = "$projectDir/app/src/main/java"
        config = "$projectDir/detekt-config.yml"
        filters = ".*test.*,.*/resources/.*,.*/tmp/.*"
    }
}

它抱怨:

Error:(17, 0) startup failed:
        build file '/Users[...]build.gradle': 17: argument list must be exactly 1 literal non empty string

See https://docs.gradle.org/4.1/userguide/plugins.html#sec:plugins_block for information on the plugins {} block

@ line 17, column 5.
        id "io.gitlab.arturbosch.detekt" version "$detect_code_analysis"
^

1 error

“新样式”Gradle plug-in 定义(不包括对 buildscript 块的完全依赖)版本中不允许变量。

有关详细信息,请参阅错误消息中提到的文档部分。有一个小节“插件 dsl 的限制”解释了一切。

如果您想继续使用可变版本字符串,您需要使用 apply plugin: “xxx” 语法 return 到“旧方法”。

您不能在 plugins {} 中使用变量:docs

Where «plugin version» and «plugin id» must be constant, literal

这是一个未解决的错误:Allow the plugin DSL to expand properties as the version

正如@Strelok 建议的最终解决方法(直到 bug 被修复)是:

  • buildscript.dependecies
  • 中添加类路径
  • plugins 更改为 apply plugin: "io.gitlab.arturbosch.detekt"

解决方案:

buildscript {

    // testing, code-style, CI-tools
    ext.detect_code_analysis = '1.0.0.RC6-3' //change to 1.0.0 when available

    repositories {
        google()
        jcenter()
        maven { url "https://plugins.gradle.org/m2/" }
    }
    dependencies {
        classpath "com.android.tools.build:gradle:$gradle_version"
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "gradle.plugin.io.gitlab.arturbosch.detekt:detekt-gradle-plugin:$detect_code_analysis"
    }
}

apply plugin: "io.gitlab.arturbosch.detekt"

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

detekt {
    version = "$detect_code_analysis"
    profile("main") {
        input = "$projectDir/app/src/main/java"
        config = "$projectDir/detekt-config.yml"
        filters = ".*test.*,.*/resources/.*,.*/tmp/.*"
    }
}