Gradle всегда выполняет задачу

Я добавил 3 конфигурации во вкусы Gradle. И я добавляю к ним некоторые zip-зависимости. Я разархивирую этот zip-файл после preBuild. Проблема в том, что моя задача распаковки всегда выполняет даже файл gradle или зависимости, которые не изменились. Эта задача распаковки требует времени, и я разрабатываю приложение ndk. Каждый раз, когда я меняю свои статические библиотеки с помощью задачи распаковки, gradle думает, что библиотеки изменились, поэтому снова собирается.

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

dependencies {
    compile "com.google.android.gms:play-services:9.4.0"
    compile 'com.android.support:multidex:1.0.0'
    compile 'com.android.support:appcompat-v7:24.+'
    compile 'com.android.support:design:24.+'
    compile fileTree(dir: 'src/main/libs', include: ['*.jar'])
    alphaCompile 'my alpha release static library from private maven repository in zip type'
    betaCompile 'my beta release static library from private maven repository in zip type'
    prodCompile 'my prod release static library from private maven repository in zip type'
}


task unzip(group: "Static Libraries", description: "Unzip all static libraries") {
    doFirst{
        // get zip files from configurations
        // unzip and move static libraries to destination folder
        }
    }
}
preBuild.finalizedBy (unzip)

person Metehan Toksoy    schedule 11.12.2016    source источник
comment
Вы исключаете из своего вопроса самую важную часть - тело метода doFirst. Вы не объявляете какие-либо входы/выходы для своей задачи, поэтому Gradle не может знать о своей актуальной проверке.   -  person mkobit    schedule 11.12.2016
comment
Хорошо, я понимаю, что мне нужно изучить жизненный цикл gradle. Я просмотрел документацию Gradle, но она выглядит сложной. Можете сказать мне, как я могу определить ввод-вывод для моей пользовательской задачи с помощью doFisrt ()?   -  person Metehan Toksoy    schedule 12.12.2016
comment
Вы захотите определить конфигурацию своей задачи в блоке { } для определения задачи. Эта часть выполняется на этапе конфигурации. Если вы определите конфигурацию там, вы столкнетесь с проблемами (см. эту страницу в Руководство пользователя). Я немного поработаю над ответом на вопрос.   -  person mkobit    schedule 12.12.2016


Ответы (1)


Трудно дать вам точный ответ, потому что вы исключили код из блока doFirst, но, похоже, вы могли бы использовать Copy, если вы просто получаете файлы конфигурации, а затем распаковываете их в другое место:

tasks.create('unzip', Copy) {
  dependsOn configurations.alphaCompile
  from {
    project.configurations.alphaCompile.collect { zipTree(it) }
  }
  into project.file("${project.buildDir}/unzipDir/")
}

Если вам нужно определить пользовательскую задачу, вам необходимо зарегистрировать входные и выходные данные во время настройка с помощью Task.getInputs() и Task.getOutputs(), чтобы Gradle мог выполнить проверку перед выполнением.

person mkobit    schedule 12.12.2016
comment
Хорошо, я понял, что я пропустил. Но теперь gradle выдает исключение: не удалось найти метод unzip() для аргументов [unzip, class org.gradle.api.tasks.Copy, build_4mrnler6ctu70k48fsy3b1k5d$_run_closure5@1d372b43] в проекте - person Metehan Toksoy; 12.12.2016
comment
У вас есть кавычки вокруг unzip? Я создаю задачу здесь, используя контейнер задач, а не то, как вы ускоряетесь в своем примере. - person mkobit; 12.12.2016
comment
Прости за мой запоздалый ответ. Ваш ответ правильный, это очень помогло. Благодарю вас! :) - person Metehan Toksoy; 15.12.2016