【问题标题】:Use PMD's Copy/Paste Detector with Gradle在 Gradle 中使用 PMD 的复制/粘贴检测器
【发布时间】:2013-12-07 22:18:55
【问题描述】:

我想在我的 Gradle 构建中使用复制/粘贴检测器。

这就是为什么我决定将以下 Ant 任务(我发现 here)翻译成 Gradle 语法:

<target name="cpd">
    <taskdef name="cpd" classname="net.sourceforge.pmd.cpd.CPDTask" />
    <cpd minimumTokenCount="100" outputFile="/home/tom/cpd.txt">
        <fileset dir="/home/tom/tmp/ant">
            <include name="**/*.java"/>
        </fileset>
    </cpd>
</target>

这是翻译目前的样子:

check << {
        ant.taskdef(name: 'cpd', classname: 'net.sourceforge.pmd.cpd.CPDTask', classpath: configurations.pmd.asPath)
        ant.cpd(minimumTokenCount: '100', outputFile: file('build/reports/pmd/copyPasteDetector.txt').toURI().toString()) {
            fileset(dir: 'src'){
                include(name: '**.java')
        }
    }
}

不幸的是,调用gradle check 会产生net.sourceforge.pmd.cpd.ReportException,堆栈跟踪是here

如何使用 Gradle 1.9 使用复制/粘贴检测器扫描我的源代码?

谢谢!

【问题讨论】:

    标签: ant gradle pmd


    【解决方案1】:

    你也可以使用我的 gradle-cpd-plugin。有关更多信息,请参阅https://github.com/aaschmid/gradle-cpd-plugin。应用cpd 插件会自动将cpd 添加为check 任务的依赖项。

    注意:我对扩展名(参见 toolVersion)和任务的名称 cpd 不太满意,欢迎提出建议 ;-)

    目前,它是 0.1 版,但我正在使用它从内部使用 CPD 的 ant 任务切换到直接调用它。这将包括对所有参数等的支持。这是一个用法示例:

    apply plugin: 'cpd'
    
    buildscript {
        repositories {
            mavenCentral()
        }
    
        dependencies {
            classpath 'de.aaschmid.gradle.plugins:gradle-cpd-plugin:0.1'
        }
    }
    
    // optional - default is 5.1.0
    cpd {
        toolVersion = '5.0.5'
    }
    
    tasks.cpd {
        reports {
            text.enabled = true
            xml.enabled = false
        }
        source = files('src/main/java')
    }
    

    【讨论】:

      【解决方案2】:

      gradle forums 的人建议你像这样在 gradle 中使用 CPD:

      task cpd(dependsOn: ':pmdSetup') {
          // Combine all source sets
          allSource = files {
              allprojects.findAll { proj ->
                  proj.hasProperty("sourceSets")
              }.collect { proj ->
                  proj.sourceSets.collect { ss ->
                      ss.java
                  }
              }
          }
          // Declare this task's inputs and outputs.
          inputs.files allSource
          outDir = file("$buildDirName/cpd")
          outputs.dir outDir
          //    outputs.files file("$outDir.path/cpd.xml")
          doLast {
              outDir.mkdirs()
              // Keep a reference to the gradle project for use inside the
              // ant closure, where "project" refers to the ant project.
              gproj = project
              ant {
                  cpd(minimumTokenCount: '100', format: 'xml',
                          outputFile: outDir.path + '/cpd.xml') {
                      fileset(dir: projectDir.getPath()) {
                          // Convert the gradle sourceSet to an ant
                          // fileset.
                          allSource.each { file ->
                              include(name: gproj.relativePath(file))
                          }
                      }
                  }
              }
          }
      }
      

      当然还有之前的apply plugin: 'pmd'

      【讨论】:

        【解决方案3】:

        我的outputFile 的定义导致了问题。

        我改编了这个build.gradle,现在我对以下解决方案感到满意:

        check << {
            File outDir = new File('build/reports/pmd/')
            // Make sure the output dir exists to prevent a ReportException
            outDir.mkdirs()
        
            ant.taskdef(name: 'cpd', classname: 'net.sourceforge.pmd.cpd.CPDTask',
                        classpath: configurations.pmd.asPath)
        
            ant.cpd(minimumTokenCount: '100', format: 'text', 
                outputFile: new File(outDir , 'cpd.txt')) {
                fileset(dir: "src/main/java") {
                    include(name: '**/*.java')
                }
            }
        }
        

        感谢 Andrey Regentov 和 Perryn Fowler 的意见。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-11-05
          • 2020-12-11
          • 2016-07-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多