Gradle 이해: incremental task

14443 단어 AndroidGradle
Gradle 기반 5.3.1
문서 목록
  • 1. 개요
  • 1.1 incremental task와 incremental task action
  • 1.2 판단기준
  • 2. 실행 실례
  • 2.1 Incremental ReverseTask 클래스
  • 2.2 Incremental ReverseTask 유형task
  • 2.3 최초 실행
  • 2.4 변경 없이 수행
  • 2.5 input 업데이트 후 실행
  • 2.6 input 제거 후 실행
  • 2.7 output 제거 후 실행
  • 2.8 input 속성을 변경한 후 실행
  • 개술
    1.1 incremental task와 incremental task action
    incremental task (증량task): 입력이 바뀌었을 때 변경된 부분만 처리할 수 있습니다.하나의incrementaltask는 하나incremental task action를 실현해야 합니다.
    incremental task action (증가task action): @TaskAction에 의해 주석된 방법으로 IncrementalTaskInputs 인자를 수신합니다.IncrementalTaskInputsoutOfDate 방법에서 변경된 input을 처리하고 removed 방법에서 제거된 input을 처리할 수 있습니다.
    1.2 판단 기준
    그래드가 어떤 input이 바뀌었는지 판단할 수 있는지IncrementalTaskInputs.incremental를 통해 판단할 수 있다.
    Gradle은 어떤 input이 변경되었는지 판단할 수 있습니다.
  • task의 실행 환경이 지난번 실행 때와 비교하면 input만 바뀌었을 때 변경된 input는out-of-date로 여겨진다.

  • 이 때 변경된 input만 outOfDate action을 실행합니다.
    Gradle은 어떤 input이 바뀌었는지 판단할 수 없습니다.
  • 이전 실행 기록이 없음
  • 서로 다른 버전의Gradle을 사용하여 실행
  • upToDateWhen이false
  • 를 반환했습니다.
  • 하나의 input 속성에 변화가 발생했다
  • 하나 이상의 output에 변화가 생겼습니다
  • 이 때 모든 input은 outOfDate action을 실행합니다.
    2. 실행 실례
    2.1 Incremental ReverseTask 클래스
    class IncrementalReverseTask extends DefaultTask {
        @InputDirectory
        // @InputDirectory      property    task      
        //     path   content    ,task      out-of-date
        File inputDir
    
    
        @OutputDirectory
        // @OutputDirectory      property    task      
        //     path   content    ,task      out-of-date
        File outputDir
    
    
        @Input
        // @Input        property    task     ,      ,task      out-of-date
        //     File    Input  ,File   path       out-of-date;File   content        out-of-date
        def inputProperty
    
    
        @TaskAction
        // @TaskAction      task       
        void execute(IncrementalTaskInputs inputs) {
            // inputs.incremental: Gradle       input    
            //        output file     ,Gradle        input      ,inputs.incremental     false
            //     input      out-of-date
            println inputs.iscremental ? 'CHANGED inputs considered out of date'
                    : 'ALL inputs considered out of date'
            if (!inputs.incremental)
                project.delete(outputDir.listFiles())
    
    
            //       input      action
            inputs.outOfDate { change ->
                if (change.file.directory) return
    
    
                println "out of date: ${change.file.name}"
                def targetFile = new File(outputDir, change.file.name)
                targetFile.text = change.file.text.reverse()
            }
    
    
            //      input      action
            inputs.removed { change ->
                if (change.file.directory) return
    
    
                println "removed: ${change.file.name}"
                def targetFile = new File(outputDir, change.file.name)
                targetFile.delete()
            }
        }
    }
    

    2.2 Incremental ReverseTask 유형task
    task incrementalReverse(type: IncrementalReverseTask) {
        inputDir = file('inputs')
        outputDir = file("$buildDir/outputs")
        inputProperty = project.properties['taskInputProperty'] ?: 'original'
    }
    

    2.3 첫 실행
    //     inputs   
    task originalInputs() {
        doLast {
            file('inputs').mkdir()
            file('inputs/1.txt').text = 'Content for file 1.'
            file('inputs/2.txt').text = 'Content for file 2.'
            file('inputs/3.txt').text = 'Content for file 3.'
        }
    }
    

    실행
    $ ./gradlew -q originalInputs incrementalReverse 
    
    ALL inputs considered out of date
    out of date: 3.txt
    out of date: 2.txt
    out of date: 1.txt
    

    2.4 변경 없이 두 번째 실행
    $ ./gradlew -q incrementalReverse
    

    출력 없음
    2.5 input 업데이트 후 실행
    task updateInputs() {
        doLast {
            file('inputs/1.txt').text = 'Changed content for existing file 1.'
            file('inputs/4.txt').text = 'Content for new file 4.'
        }
    }
    

    실행
    $ ./gradlew -q updateInputs incrementalReverse
    
    CHANGED inputs considered out of date
    out of date: 1.txt
    out of date: 4.txt
    

    2.6 input 제거 후 실행
    task removeInput() {
        doLast {
            file('inputs/3.txt').delete()
        }
    }
    

    실행
    $ ./gradlew -q removeInput incrementalReverse
    
    CHANGED inputs considered out of date
    removed: 3.txt
    

    2.7 output 제거 후 실행
    task removeOutput() {
        doLast {
            file("$buildDir/outputs/1.txt").delete()
        }
    }
    

    실행
    $ ./gradlew -q removeOutput incrementalReverse
    
    ALL inputs considered out of date
    out of date: 4.txt
    out of date: 2.txt
    out of date: 1.txt
    

    2.8 input 속성 변경 후 실행
    $ ./gradlew -q -PtaskInputProperty=changed incrementalReverse
    
    ALL inputs considered out of date
    out of date: 4.txt
    out of date: 2.txt
    out of date: 1.txt
    

    좋은 웹페이지 즐겨찾기