Как я могу заставить gradle перезагружать зависимости?

Как я могу сказать gradle для повторной загрузки зависимостей из репозиториев?

26 ответов

Решение

Как правило, вы можете обновить зависимости в вашем кэше с помощью параметра командной строки --refresh-dependencies. Вы также можете удалить кэшированные файлы в ~/.gradle/caches, При следующей сборке Gradle попытается загрузить их снова.

Каков ваш конкретный вариант использования? Используете ли вы динамические версии зависимостей или версии SNAPSHOT?


В системах Unix вы можете удалить все существующие артефакты (артефакты и метаданные), загруженные Gradle с помощью:

rm -rf $HOME/.gradle/caches/

Если вы используете последнюю версию Gradle, вы можете использовать опцию --refresh-dependencies.

./gradlew build --refresh-dependencies

Вы можете обратиться к руководству Gradle.

Опция --refresh-dependencies указывает Gradle игнорировать все кэшированные записи для разрешенных модулей и артефактов. Новое решение будет выполнено для всех настроенных репозиториев с пересчетом динамических версий, обновлением модулей и загрузкой артефактов.

Вы можете указать Gradle повторно загрузить некоторые зависимости в сценарии сборки, пометив зависимость как "изменяющуюся". Затем Gradle будет проверять наличие обновлений каждые 24 часа, но это можно настроить с помощью ResolutionStrategy DSL. Я считаю полезным использовать это для SNAPSHOT или NIGHTLY.

configurations.all {
    // Check for updates every build
    resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}

Expanded:

dependencies {
    compile group: "group", name: "projectA", version: "1.1-SNAPSHOT", changing: true
}

Сгущенное:

compile('group:projectA:1.1-SNAPSHOT') { changing = true }

Я нашел это решение в этой ветке форума.

Для MAC

./gradlew build --refresh-dependencies

Для Windows

gradlew build --refresh-dependencies

Можно также попробовать gradlew assembleDevelopmentDebug --refresh-dependencies

Для Windows... для того, чтобы заставить gradle повторно загружать определенные зависимости:

  1. удалите зависимости, которые вы хотите повторно загрузить из каталога ниже:

    C:\Users\[username]\.gradle\caches\modules-2\files-2.1
    
  2. удалите все каталоги метаданных по пути:

    C:\Users\[username]\.gradle\caches\modules-2\metadata-*
    
  3. бежать gradle build (или же gradlew build если используется gradle wrapper) в корневом каталоге проекта.

примечание: числа в путях к файлам выше могут отличаться для вас.

Ни одно из приведенных выше решений не помогло мне.

Если вы используете IntelliJ, я решил просто обновить все проекты Gradle:

Для тех, кому интересно, где запускать команды gradle:

Откройте android studio -> Нажмите на терминал (вы найдете его в базе android studio)-> Откроется инструмент командной строки ---> Введите вашу команду (gradlew build --refresh-dependencies)

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

В моем случае на Mac библиотека кэшировалась по пути:

/Users/MY_NAME/.gradle/caches/modules-2/files-2.1/cached-library-to-remove

Я удалил папку с кэшированной библиотекой ("cached-library-to-remove" в приведенном выше примере), удалил папку сборки моего проекта и снова скомпилировал. Свежая библиотека была загружена тогда.

Единственная возможность обновить кэшированную "релизную" версию - очистить локальный кеш.

rm -rf $HOME/.gradle/caches/

Чтобы обновить кешированную версию "моментального снимка", вы можете:

./gradlew build --refresh-dependencies

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

deleteGradleCache() {
  local id=$1
  if [ -z "$id" ]; then
    echo "Please provide an group or artifact id to delete"
    return 1
  fi
  find ~/.gradle/caches/ -type d -name "$id" -prune -exec rm -rf "{}" \; -print
}

Использование:

$ deleteGradleCache com.android.support

Затем при следующей сборке или при повторной синхронизации gradle повторно загрузит зависимости.

Кажется change изменен на isChange для gradle версии 6.3, kotlin версии 1.3.70, Groovy 2.5.10

Рабочая конфигурация

implementation("com.sample:commons:1.0.0-SNAPSHOT") {
        isChanging = true
    }

Кроме того, запустите эту команду, чтобы получить последнюю версию

./gradlew assemble  --refresh-dependencies

Есть 2 способа сделать это:

  1. Использование параметра командной строки для обновления кэша зависимостей.
  2. Вы можете удалить локальный кеш, где артефакты являются кешами Gradle и запустить сборку

Использование параметра --refresh-dependencies:

./gradlew build --refresh-dependencies

Краткое объяснение --refresh-dependencies опция указывает Gradle игнорировать все кэшированные записи для разрешенных модулей и артефактов.

Долгое объяснение

  • WIth –refresh-dependencies 'Gradle всегда попадет на удаленный сервер, чтобы проверить наличие обновленных артефактов: однако, Gradle будет избегать загрузки файла, в котором тот же файл уже существует в кэше.
    • First Gradle выполнит запрос HEAD и проверит, сообщает ли сервер файл без изменений с прошлого раза (если "content-length" и "last-updated" не изменились). В этом случае вы получите сообщение: "Кэшированный ресурс обновлен (lastModified: {})".
    • Next Gradle определит удаленную контрольную сумму, если это возможно (либо из запроса HEAD, либо путем загрузки файла '.sha1'). Если эта контрольная сумма соответствует другому уже загруженному файлу (из любого хранилища), то Gradle просто скопирует файл в кеш, а не повторная загрузка. В этом случае вы получите сообщение: "" Найден локально доступный ресурс с соответствующей контрольной суммой: [{}, {}] ".

Использование delete: при удалении кешей

rm -rf $HOME/.gradle/caches/

Вы просто очищаете все кэшированные банки и суммы sha1, и Gradle находится в ситуации, когда на вашем компьютере нет артефактов, и он должен загрузить все. Да, он будет работать на 100% в первый раз, но когда будет выпущен еще один SNAPSHOT, и он станет частью вашего дерева зависимостей, вам снова придется столкнуться с выбором обновления или очистки кешей.

Для Android Studio 3.4.1

Просто откройте вкладку Gradle (может быть расположена справа) и щелкните правой кнопкой мыши на родительском элементе в списке (должен называться "Android"), затем выберите "Обновить зависимости".

Это должно решить вашу проблему.

Если вы используете Intellij, вы можете щелкнуть правой кнопкой мыши корневой проект и затем выбрать обновить зависимости Gradle.

Это сработало для меня. Убедитесь, что Gradle не переведен в автономный режим, сняв отметку с кнопки "Файл"> "Настройки"> "Gradle"> "Автономная работа"

Добавьте это на верхний уровень вашего build.gradle, приятно иметь вышеуказанные зависимости

configurations.all {
    resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}

Я убедился, что мои зависимости написаны так:

implementation('com.github.juanmendez:ThatDependency:ThatBranch-SNAPSHOT') {
    changing = true
}

После этого я открываю панель Gradle в Android Studio и нажимаю кнопку со стрелками синего круга. Я всегда вижу, как мои обновления получают новую свежую копию.

Я слишком поздно, но мое решение для единого хранилища. Я думаю, что удаление ~/.gradle/* излишне. Проблема, с которой я столкнулся, заключалась в том, что я удалял каталог, в котором находились источники, а Gradle получал другую версию, а не от Nexus. Чтобы избежать этого, я запускаю следующее:

~/.gradle$ find . -type d -name 'group.plugins.awssdk'
./caches/modules-2/files-2.1/group.plugins.awssdk
./caches/modules-2/metadata-2.23/descriptors/group.plugins.awssdk

~/.gradle$ rm -r ./caches/modules-2/files-2.1/group.plugins.awssdk   ./caches/modules-2/metadata-2.23/descriptors/group.plugins.awssdk

После этого Gradle перетаскивает файлы с Nexus.

В моем случае ничего из вышеперечисленного не сработало, я сделал следующее:

  • В build.gradle, комментируя зависимости, связанные с неразрешенным импортом, который у меня был
  • Нажав "Синхронизировать сейчас"
  • Раскомментируя то, что я только что прокомментировал
  • Повторное нажатие "Синхронизировать сейчас"

Затем мой импорт снова был правильно разрешен.

Удалить этот каталог:

C:\Users\[username]\.gradle

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

Как только я смогу решить эту проблему ниже.

Просто удалите группы, которые необходимо обновить.

Пример: если мы хотим обновить группу com.user.test

rm -fr ~/.gradle/caches/modules-2/files-2.1/com.user.test/

затем удалите зависимость из build.gradle и повторно добавьте ее. тогда он обновит зависимости, что мы хотим.

Это для Kotlin DSL (build.gradle.kts):

      configurations.all {
    resolutionStrategy.cacheChangingModulesFor(0, TimeUnit.SECONDS)
}
      dependencies {
    // ...
    implementation("ir.mahozad.multiplatform:wavy-slider:0.0.1") {
        isChanging = true
    }
}

Я думаю, что Gradle 2.14.1 решает проблему. Принятый ответ правильный, но в gradle есть ошибка с –refresh-dependencies. 2.14.1 исправляет это.

См. https://discuss.gradle.org/t/refresh-dependencies-should-use-cachechangingmodulesfor-0s/556

Работает только ручное удаление конкретной зависимости в папке кэша... артефакт, созданный коллегой в корпоративном репо.

В большинстве случаев достаточно просто перестроить проект. Иногда нужно бежать ./gradlew build --refresh-dependencies как уже упоминалось в нескольких ответах (это занимает много времени, в зависимости от того, сколько у вас зависимостей). Однако иногда ни один из них не будет работать: зависимость не будет обновлена. Затем вы можете сделать это:

  1. Удалить зависимость из вашего файла Gradle
  2. Запустите / отладьте ваш проект и дождитесь его сбоя (с NonExistingClass причина)
  3. Нажмите "построить проект" и дождитесь его успешного завершения
  4. Запустить / отладить еще раз

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

Вы можете сделать это так

https://marschall.github.io/2017/04/17/disabling-gradle-cache.html

Цитировать из Отключение кэша сборки Gradle

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

Чтобы отключить кэш сборки Gradle, добавьте следующую строку в ~/.gradle/gradle.properties

org.gradle.caching=false

Вы можете очистить существующий кеш с помощью

rm -rf $HOME/.gradle/caches/
rm -rf $HOME/.gradle/wrapper/

Если вы используете eclipse и если вы хотите, чтобы eclipse перезагружал зависимости, попробуйте команду ниже

gradlew clean cleaneclipse build eclipse --refresh-dependencies

Вам необходимо повторно загрузить его, чтобы вы могли вручную загрузить и заменить поврежденный файл и снова синхронизировать ваш проект. Перейдите по этому адресу C:\users[username].gradle\wrapper\dist\gradle3.3-all\55gk2rcmfc6p2dg9u9ohc3hw9\gradle-3.3-all.zip Здесь удалите gradle3.3allzip и замените его, загрузив снова с этого сайта https://services.gradle.org/distributions/ Найдите тот же файл, загрузите и вставьте его в это место. Затем синхронизируйте ваш проект. Надеюсь, это работает и для вас.

Другие вопросы по тегам