Подтвердить что ты не робот

Gradle: принудительно выполнять произвольную задачу (без кеша)

Я написал специальную задачу Gradle для обработки некоторого разрешения зависимости в файловой системе, где пути настраиваются. Я хочу, чтобы задачи этого типа всегда запускались. Кажется, хотя они работают только один раз, я предполагаю, что входы никогда не меняются.

Мне известно использовать configurations { resolutionStrategy.cacheChangingModulesFor 0, 'seconds' }, чтобы эффективно отключить кеш, но я хочу, чтобы он применялся к очень конкретным задачам. Также мне известно о командной строке --rerun-tasks командной строки, которая также аналогична. Ничто не кажется лучшим решением, должен быть способ правильно настроить его в определении пользовательской задачи.

Выполняется моя текущая реализация. У меня также была версия, в которой первые 3 команды def String были вместо @Input аннотированными объявлениями String.

class ResolveProjectArchiveDependency extends DefaultTask {
    def String archiveFilename = ""
    def String relativeArchivePath = ""
    def String dependencyScope = ""

    @OutputFile
    File outputFile

    @TaskAction
    void resolveArtifact() {
        def arcFile = project.file("dependencies/"+dependencyScope+"/"+archiveFilename)
        def newArcFile = ""

        if(project.hasProperty('environmentSeparated') && project.hasProperty('separatedDependencyRoot')){
            println "Properties set denoting the prerelease environment is separated"
            newArcFile = project.file(project.ext.separatedDependencyRoot+relativeArchivePath+archiveFilename)
        }   else {
            newArcFile = project.file('../../'+relativeArchivePath+archiveFilename)
        }

        if(!newArcFile.isFile()){
            println "Warn: Could not find the latest copy of " + archiveFilename + ".."

            if(!arcFile.isFile()) {
                println "Error: No version of " + archiveFilename + " can be found"
                throw new StopExecutionException(archiveFilename +" missing")
            }
        }

        if(!arcFile.isFile()) {
            println archiveFilename + " jar not in dependencies, pulling from archives"
        } else {
            println archiveFilename + " jar in dependencies. Checking for staleness"

            def oldHash = generateMD5(new File(arcFile.path))
            def newHash = generateMD5(new File(newArcFile.path))

            if(newHash.equals(oldHash)) {
                println "Hashes for the jars match. Not pulling in a copy"
                return
            }
        }

        //Copy the archive
        project.copy {
            println "Copying " + archiveFilename
            from newArcFile
            into "dependencies/"+dependencyScope
        }
    }

    def generateMD5(final file) {
       MessageDigest digest = MessageDigest.getInstance("MD5")
       file.withInputStream(){is->
       byte[] buffer = new byte[8192]
       int read = 0
          while( (read = is.read(buffer)) > 0) {
                 digest.update(buffer, 0, read);
             }
         }
       byte[] md5sum = digest.digest()
       BigInteger bigInt = new BigInteger(1, md5sum)
       return bigInt.toString(16)
    }
}

Вот пример использования задачи:

task handleManagementArchive (type: com.moremagic.ResolveProjectArchiveDependency) {
    archiveFilename = 'management.jar'
    relativeArchivePath = 'management/dist/'
    dependencyScope = 'compile/archive'
    outputFile = file('dependencies/'+dependencyScope+'/'+archiveFilename)
}
4b9b3361

Ответ 1

Вы можете достичь этого, установив outputs.upToDateWhen { false } в задачу.

Это может быть выполнено в файле build.gradle:

handleManagementArchive.outputs.upToDateWhen { false }

Он также может быть выполнен в конструкторе вашей пользовательской задачи.

ResolveProjectArchiveDependency() {
    outputs.upToDateWhen { false }
}