1

Gradle から Javascript コード カバレッジを佐賀県に発信しようとしていました。長い間遊んだ後、ついにそれを機能させることができました。ただし、私はgradleを初めて使用するので、自分のやり方が最も理にかなっているのかどうかわかりません! これを行うにはかなりの方法があるように思われるので、この方法で問題ないか、より良い方法があるかどうかを知ることができることを期待して、ここで行ったことを投稿すると思いました。

Maven Central から saga-core をダウンロードした後、Java の「メイン」がないことが判明しました。そのため、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')   
}
4

1 に答える 1

2

まともなスタートのように見えます。通常、ファイル オブジェクトはこのproject.file()メソッドを使用して作成する必要があります。これは、相対パスをより適切に処理できるためですnew File()(ただし、この特定のケースでは問題になりません)。例: file("$reportsDir/coverage").

タスク クラスが大きくなったり、複数のプロジェクトやビルドで再利用したい場合は、別の場所 (例:buildSrcなど) に移動して、テスト カバレッジを追加する必要があります。

タスク クラスのプロパティに @InputDirectory、@OutputDirectory などのアノテーションを付けることで、一部の入力が変更された場合、または以前に生成された出力が利用できなくなった場合にのみタスクが実行されるようにすることができます。これにより、ビルドを高速化できます。

于 2012-08-22T12:22:49.807 に答える