Gradle의 Findbugs 결과를 표준 출력으로 내보내기

Gradle 에서 실행한 Findbugs 의 결과를 보는 것이 다르기 때문에 표준 출력에 결과를 토해내는 태스크를 쓴다.

이런 느낌:



Findbugs의 결과를 보는 것이 어렵습니다.



보고서를 보는 방법은 다음과 같습니다.
  • 디폴트라고 「XML에 결과 출력했기 때문에 봐」라는 취지의 메세지가 나오는 것 뿐이므로, 그 패스를 어떠한 뷰어에게 씹는다
  • HTML 출력으로 설정 변경
  • XML을 해석해 주는 CI와 궁합이 나쁘다. CI에서만 XML 출력으로 변경해야합니다

  • emacs 출력으로 설정 변경
  • 2.와 같은 문제 이외에 출력되는 정보가 적기 때문에, 버그의 식별자로 상세를 조사할 필요가 있다.


  • 그리고 귀찮은 느낌.

    Intellij IDEA의 findbugs 플러그인 시스템은 gradle과 함께 작동하지 않으므로 이야기하지 않습니다.

    왠지 다른 gradle 플러그인과 달리 표준 출력해 주는 기능이 없다. Findbugs 플러그인에는 이러한 리포터가 있습니다.이 현재 작동하지 않습니다 :
  • [GRADLE-2994] Add additional reports to FindBugs - Gradle Issues

  • 이전 Findbugs의 CLI 옵션 이었습니까?

    어쨌든, 사용할 수 있어도 리포터는 1개 밖에 선택할 수 없기 때문에, 전술한 2. 의 문제가 또 나온다. 다르다.

    모두 이것 뭐하는 거야. . . 다른 IDE라면 더 현명한 플러그인이 있을까.

    너무 힘들어서 어떻게 했는지



    findbugs를 라이브러리로 읽으면 XML 파서도 온다 같기 때문에 Findbugs 실행 후 XML을 구문 분석하여 표준 출력으로 토출하는 기능을 썼습니다.

    build.gradle
    import edu.umd.cs.findbugs.SortedBugCollection
    
    buildscript {
        repositories {
          mavenCentral()
        }
        dependencies {
            classpath 'com.google.code.findbugs:findbugs:3.0.1'
        }
    }
    
    apply plugin: 'findbugs'
    
    // ... other settings
    
    // print findbugs results to console
    task printFindbugsResults << {
        [findbugsMain, findbugsTest].forEach {
            printFBXml it.reports.xml.destination
        }
    }
    printFindbugsResults.mustRunAfter findbugsMain, findbugsTest
    check.dependsOn printFindbugsResults
    
    def printFBXml(File xml) {
        if (!xml.exists()) return
    
        def bugs = new SortedBugCollection()
        bugs.readXML(xml)
        def msgs = bugs.collect { bug ->
            def srcLine = bug.primarySourceLineAnnotation
            // ※1 バグ個別の出力フォーマット
            """\
              |# ${bug.type}
              |${srcLine.className}:${srcLine.startLine}:${srcLine.endLine}
              |${bug.abridgedMessage}
              |${bug.bugPattern.detailPlainText.trim()}
            """.stripMargin().trim()
        }
    
        if (msgs.isEmpty()) return
    
        logger.error """\
            |===
            |${msgs.join("\n---\n")}
            |===
        """.stripMargin().trim()
    }
    
    

    코멘트의 ※1 의 근처가 출력 형식이 되므로, BugInstance 이나 SourceLineAnnotation 의 프로퍼티를 바라보고 적당하게 변경합시다.

    드디어 :
    System.setProperty('org.gradle.color.error', 'RED')
    

    글을 쓰면 처음의 거리의 외형이됩니다.



    사실은 출력색 지정은 gradle 의 logger 와는 별도로 하는 편이 좋을지도.

    좋은 웹페이지 즐겨찾기