25

我正在评估新的基于 gradle 的构建系统重现我们当前基于 ant 的构建过程的能力,作为一个 gradle 初学者,我未能使用 android gradle 插件运行 checkstyle。

环境:

  • gradle 1.6 在标准 java 项目上运行良好(包括 checkstyle 检查目标)

  • 最新的 android SDK(22.0.1 带有平台工具和构建工具 17)

  • 没有日食,没有安卓工作室,只有我可爱的终端

症状:

目标项目是https://github.com/nibua-r/LigoTextDemo我成功地使用 gradle 构建了它,但是如果我天真地添加apply plugin: checkstyle到我的build.gradle

buildscript {
  repositories {
    mavenCentral()
  }
  dependencies {
    classpath 'com.android.tools.build:gradle:0.4.2'
  }
}
apply plugin: 'android'
apply plugin: 'checkstyle'

android {
  buildToolsVersion '17'
  compileSdkVersion 15
  testBuildType 'debug'

  defaultConfig {
    versionCode = 1
    versionName = '1.0'
    minSdkVersion 12
    targetSdkVersion 15
  }

  buildTypes {
    debug {
      packageNameSuffix = '.debug'
    }
  }
}

然后gradle check甚至不会抱怨找不到checkstyle.xml文件(在默认config/checkstyle位置)并返回:

:check UP-TO-DATE

BUILD SUCCESSFUL

需要什么:

首先,我只需要一个正在运行的 checkstyle 目标。然后,我需要自动运行 checkstyle 作为编译的依赖项(但首先让 chekstyle 目标启动并运行)。

假设:

这可能与以下事实有关(来自 [用户指南][1]):

Android 插件 [...] 使用自己的 sourceSets

但我没有足够的 gradle-efficient 来理解我在那里缺少的东西。请gradle大师用您宝贵的知识赐教!

4

6 回答 6

30

我使用以下脚本获得了 pmd、findbugs 和 checkstyle 与 Gradle 1.12 android 插件 0.12.+ 一起使用:

apply plugin: 'checkstyle'
apply plugin: 'findbugs'
apply plugin: 'pmd'

check.dependsOn 'checkstyle', 'findbugs', 'pmd'

task checkstyle(type: Checkstyle) {
    configFile file("${project.rootDir}/config/quality/checkstyle/checkstyle.xml")
    source 'src'
    include '**/*.java'
    exclude '**/gen/**'

    classpath = files()
}

task findbugs(type: FindBugs) {
    ignoreFailures = true
    effort = "max"
    reportLevel = "high"
    excludeFilter = new File("${project.rootDir}/config/quality/findbugs/findbugs-filter.xml")
    classes = files("$project.buildDir/intermediates/classes/")

    source 'src'
    include '**/*.java'
    exclude '**/gen/**'

    reports {
        xml {
            destination "$project.buildDir/reports/findbugs/findbugs.xml"
            xml.withMessages true
        }
    }

    classpath = files()
}

task pmd(type: Pmd) {
    ruleSetFiles = files("${project.rootDir}/config/quality/pmd/pmd-ruleset.xml")
    ignoreFailures = true
    ruleSets = ["basic", "braces", "strings"]

    source 'src'
    include '**/*.java'
    exclude '**/gen/**'

    reports {
        xml.enabled = true
        html.enabled = false
    }
}

在命令行中运行gradle build将运行所有代码质量插件并在app/build/reports/中生成 xml 报告,然后这些报告可供 CI 工具查看或解析。

于 2014-04-10T14:35:27.800 回答
7

有人有一个很好的答案来解决将 PMD、findbugs 和 checkstyle 与 Gradle for Android 集成。不幸的是,目前唯一的解决方案是基于 ant: http ://sethrylan.org/2013/07/14/gradle-android-findbugs.html

我希望 gradle 有朝一日允许为 Android 做 maven 一样多的事情。

--- 2013 年 10 月更新

使用 Gradle 1.8 和 Gradle 0.6.+ 的 Android 插件,您不再需要这个。Android 源集和配置现在与 java 插件兼容,所有质量插件都可以开箱即用。

这包括 pmd、findbugs、checkstyle 和 classycle。

--- 更新 在这个开源项目中也提出了一个很大程度上受上述项目启发的配置,以及其他工具。

于 2013-08-12T00:04:33.340 回答
5

你可以试试 Android Check 插件(https://github.com/noveogroup/android-check):

  • 格纹风格
  • PMD

配置:

buildscript {
    repositories { jcenter() }
    dependencies {
        ...
        classpath 'com.noveogroup.android:check:+'
        ...
    }
}

apply plugin: 'com.noveogroup.android.check'

您可以使用核心配置:

check {
    abortOnError true
    checkstyle { config hard() }
    pmd { config hard() }
}
于 2015-02-13T07:37:04.783 回答
5

为了让它与我的 Android 项目一起工作,我必须明确声明任务。

这对我有用:

apply plugin: 'checkstyle'

task checkstyle(type: Checkstyle) {
    source 'src'
    include '**/*.java'
    exclude '**/gen/**'

    // empty classpath
    classpath = files()
}

请注意,Android 插件将来可能会选择创建同名任务,或者以不同的方式与 checkstyle 插件一起工作。

于 2013-09-25T17:48:11.313 回答
3

我通过在网上挖掘发现Android插件依赖于java-base而不是java(即sourceSets管理是特定的)并且checkstyle插件依赖于java。因此,需要对 gradle 上游进行一些修改才能完成工作。正如 twitter 上所见,gradle 团队正在努力解决这个问题:

@anzix Android 源代码集很快就会被通用代码质量插件所理解。这方面的工作已经开始。

— Gradle 构建系统 (@Gradleware) 2013 年 5 月 26 日
于 2013-08-14T08:01:26.473 回答
1

看看Soter Gradle 插件,它可以无缝地为 Android 项目添加对 Findbugs、Checkstyle 和 PMD 的支持。

于 2015-07-21T07:41:10.093 回答