如何从gradle中调用任意方法?

时间:2012-08-22 11:54:41

标签: javascript gradle saga

试图从Gradle调用Saga Javascript代码覆盖率。经过很长一段时间玩它,我终于能够让它工作了。但是,我是新手,并且不知道我做它的方式是否最有意义!似乎可能有很多方法可以做到这一点,所以我想我会发布我在这里所做的,希望我可以学习这种方式是否合适或是否有更好的方法。

从maven central下载saga-core后,事实证明没有Java“main”。所以我认为我不能轻易使用JavaExec。在我看来,我需要创建一个Java对象,设置一些参数,并调用提供的“运行”方法。

这是我最终的build.gradle:

apply plugin: 'groovy'

buildscript {    
    repositories {
        mavenCentral()
    }

    dependencies {
        // add the jar file withe the code you want to execute to gradle's classpath
        classpath 'com.github.timurstrekalov:saga-core:1.1.2'
    }
}

configurations {
    compile
    codeCoverageTask
}

dependencies {
    groovy localGroovy()
    codeCoverageTask 'com.github.timurstrekalov:saga-core:1.1.2'
}

// I thought this was simple and made sense to be co-located here rather than
// another file...
// getting the imports to compile requires adding the "buildscript" section above
import java.io.File
import com.github.timurstrekalov.saga.core.CoverageGenerator

class SagaCoverageTask extends DefaultTask {
    def outputDirectory
    def baseDirectory
    def includes = 'my_includesPattern_here'
    def excludes = 'my_excludesPattern_here'
    def noInstrumentPatterns = [ 'my_noIntrumentPatterns_here' ]

    @TaskAction
    def runCoverage() {
        // check these were set correctly!
        println outputDirectory
        println 'baseDir' + baseDirectory

        // create an instance of the object
        CoverageGenerator generator = new CoverageGenerator(baseDirectory, includes, excludes, outputDirectory)   
        generator.noInstrumentPatterns = noInstrumentPatterns
        // there are params, but they would be handled in the same way if needed
        generator.run()   // invoke the arbitrary method
    }
}

task genCodeCoverage(type: SagaCoverageTask)  {
    // needed the values of task properties, so these are set here
    outputDirectory = new File('' + reportsDir + '/coverage')
    baseDirectory = new File('' + projectDir + '/src')   
}

1 个答案:

答案 0 :(得分:2)

看起来像一个不错的开始。通常应使用project.file()方法创建文件对象,因为它处理的相对路径优于new File()(尽管在这种特殊情况下它不是问题)。例如:file("$reportsDir/coverage")

如果任务类变大或想要在项目/构建中重复使用它,则应将其移到其他位置(例如转移到buildSrc)并添加一些测试覆盖率。

通过使用@InputDirectory,@ OutputDirectory等注释任务类属性,您可以使任务仅在某些输入已更改或以前生成的输出不再可用时才会运行。这可以加快构建速度。