2012-08-22 2 views
1

Gradle에서 Saga Javascript 코드 적용 범위로 전화를 걸려고했습니다. 오랫동안 연주 한 후에 마침내 효과를 낼 수있었습니다. 그러나, 나는 gradle에 새로 왔고, 내가 그것을했던 방식이 가장 합리적인지 아닌지에 관해 모른다! 이렇게하는 데는 몇 가지 방법이있을 것 같아서,이 길은 괜찮은지, 아니면 더 좋은 길을 찾았는지 알기 위해 내가 여기에했던 것을 게시 할 것이라고 생각했습니다.gradle에서 임의의 메서드를 호출하는 방법은 무엇입니까?

maven central에서 saga-core를 다운로드 한 후 Java "main"이 없음이 밝혀졌습니다. 따라서 JavaExec을 쉽게 사용할 수 있다고 생각하지 않았습니다. Java 객체를 만들고, 일부 매개 변수를 설정하고, 제공된 "run"메소드를 호출해야한다는 것을 알게되었습니다.

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') 
} 

답변

2

괜찮은 시작 것 같은데 :

는 여기에 내가 함께 결국 최종 build.gradle입니다. 파일 개체는 일반적으로 이상의 상대 경로를 처리하기 때문에 project.file() 메서드로 만들어야합니다 (이 경우에는 문제가되지 않지만). 예 : file("$reportsDir/coverage").

작업 클래스가 커지거나 프로젝트/빌드간에 다시 사용하려는 경우 다른 곳으로 이동해야합니다 (예 : buildSrc). 일부 테스트 적용 범위를 추가해야합니다.

@InputDirectory, @OutputDirectory 등으로 작업 클래스 속성에 주석을 추가하여 일부 입력이 변경되었거나 이전에 생성 된 출력을 더 이상 사용할 수없는 경우에만 작업이 실행되도록 만들 수 있습니다. 이렇게하면 빌드 속도를 높일 수 있습니다.