Як змусити gradle перезавантажувати залежності?


740

Як я можу сказати gradle перезавантажувати залежності із сховищ?

Відповіді:


845

Як правило, ви можете оновити залежності у своєму кеші за допомогою параметра командного рядка --refresh-залежності . Ви також можете видалити кешовані файли під ~/.gradle/caches. При наступній збірці Gradle спробує завантажити їх знову.

Який конкретний випадок використання? Ви використовуєте версії динамічної залежності або версії SNAPSHOT?


У системах Unix можна видалити всі існуючі артефакти (артефакти та метадані), завантажені Gradle, використовуючи:

rm -rf $HOME/.gradle/caches/

27
Я не можу виступати за ОП, але моїм конкретним випадком використання є тестування того, чи справді працює моя конфігурація сховища, що не є MavenCentral.
Еміль Лундберг

7
Вам також потрібно видалити каталог ~ / .m2 (якщо він існує). Якщо ви налаштували maven repo, деякі з цих артефактів також завантажуються до ~ / .m2. Краще видалити і ~ / .gradle, і ~ / .m2, щоб почати з чистого сланця.
Gopinath MR

17
Maven Local доречний лише у тому випадку, якщо ваша збірка визначає його як сховище.
Бенджамін Мушко

21
@Gopinath це небезпечна порада, оскільки .m2 може містити файл налаштування Maven. Я думаю, ви маєте на увазі видалити .m2 / сховище
Ward

9
find $HOME/.gradle/caches/ -name "*LIBRARY_NAME*" -exec rm -r {} \;
fangzhzh

708

Якщо ви використовуєте останню версію Gradle, ви можете скористатися опцією --refresh-зависимостей.

./gradlew build --refresh-dependencies

ви можете посилатися на посібник Gradle .

Опція --refresh-зависимостей вказує Gradle ігнорувати всі кешовані записи для вирішених модулів та артефактів. Повторне рішення буде виконано для всіх налаштованих сховищ, з перерахунком динамічних версій, оновленими модулями та завантаженими артефактами.


10
Ви повинні зазначити, що оскільки gradle намагатиметься завантажити весь файл залежності, це потребує багато часу.
Нага

11
Варто також зазначити, що це не завжди працює. Я щойно тестував запуск "gradle clear war - refreresh-зависимост" із кешованою банку, якій було три дні, коли я розгорнув нову версію пізно вчора ввечері. Збірка склалася через відсутність залежності, яка була додана в новому коді. Після цього у мене в кеш-пам'яті була триденна баночка. У кінцевому підсумку я просто видалив папку версій у своєму кеші .m2 та відновив її. Потім він отримав найновішу версію, тому що в основному не було іншого вибору!
Spanky Quigman

10
ще краще просто ./gradlew
оновити

1
Це чудово спрацювало як "./gradlew build - refreresh-залежності" від терміналу Android Studio. Дякую!
the_dude_abides

2
Чи є спосіб змусити Android Studio зробити це на створенні зсередини IDE?
Карл

313

Ви можете сказати Gradle повторно завантажити деякі залежності в сценарії збірки, позначивши залежність як "мінливу". Потім Gradle перевірятиме оновлення кожні 24 години, але це можна налаштувати за допомогою роздільної здатності Stratesy DSL. Мені здається корисним використовувати це для побудови SNAPSHOT або NIGHTLY.

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

Розширено:

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

Конденсований:

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

Я знайшов це рішення у цій темі форуму .


4
Чи знаєте ви, як це працює для джерел однієї бібліотеки? Наразі складена бібліотека завантажується щоразу, коли вона змінюється, але джерело - ні.
Маркус Вюстенберг

2
Версія знімка "змінюється" за визначенням. Gradle це знає, тому вам фактично не потрібно визначати це у своїй декларації про залежність.
Бенджамін Мушко

4
Дякую за це FWIW, наша залежність була від знімкової версії, і поки ми цього не зробили, вона не перевіряла оновлення для кожної збірки.
sfitts

10
cacheChangingModulesForє ключовим, changing: trueнеобов’язковий, оскільки це мається на увазі -SNAPSHOT, тут можна використовувати скорочення: compile 'group:projectA:1.1-SNAPSHOT'через вищезазначене значення. Можна також обмежити resolutionStrategy до однієї конфігурації: configurations.compile.resolutionS....
TWiStErRob

2
@Umi Чи є скорочена версія цього? Такі як compile 'com.burrowsapps:ads:1.0:true'?
Джаред Берроуз

63

Для MAC

./gradlew build --refresh-dependencies

Для Windows

gradlew build --refresh-dependencies

Можна також спробувати gradlew assembleDevelopmentDebug --refresh-dependencies


2
Android використовує звичайні кренделі. Це просто плагін.
Драгас

Обгортка Gradle - це не ексклюзивний Android. Ви можете створити один, використовуючи gradle wrapperзавдання; Ви навіть можете генерувати обгортку, використовуючи іншу обгортку Gradle:gradlew wrapper
Salvioner

28

Для 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) у кореневому каталозі проекту.

зауважте: цифри у шляхах до файлів вище можуть бути різними для вас.


19

Ви можете видалити папку з кешованими банками.

У моєму випадку на Mac бібліотека була кешована на шляху:

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

Я видалив кешовану папку бібліотеки ("cached-library-to remove" у наведеному вище прикладі), видалив папку build мого проекту та знову скомпілював. Тоді була завантажена свіжа бібліотека.


16

Замість того, щоб видаляти весь кеш 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 повторно завантажить залежності.


9

Є два способи зробити це:

  1. Використання опції командного рядка для оновлення грошових коштів залежності.
  2. Ви можете видалити локальний кеш, де артефасти є кешами за допомогою Gradle та тригерної збірки

Використання опції --refresh-зависимостей :

./gradlew build --refresh-dependencies

Коротке пояснення - опція refreresh-зависимості говорить Gradle ігнорувати всі кешовані записи для вирішених модулів та артефактів.

Довге пояснення

  • WIth –refresh-залежності 'Gradle завжди буде потрапляти на віддалений сервер, щоб перевірити наявність оновлених артефактів: однак, Gradle уникатиме завантаження файлу, де той самий файл вже існує в кеш-пам'яті.
    • Перший Gradle зробить запит HEAD і перевірить, чи сервер повідомляє про файл як про незмінний з останнього разу (якщо "довжина вмісту" та "остання зміна" не змінюються). У цьому випадку ви отримаєте повідомлення: "Кешований ресурс оновлений (lastModified: {})."
    • Далі Gradle визначає віддалену контрольну суму, якщо це можливо (або з запиту HEAD, або завантажуючи файл ".sha1"). Якщо ця контрольна сума відповідає іншому вже завантаженому файлу (з будь-якого сховища), Gradle просто копіює файл у кеш, а не повторне завантаження. У цьому випадку ви отримаєте повідомлення: "" Знайдений локально доступний ресурс із відповідною контрольною сумою: [{}, {}] ".

Використання видалення: Коли ви видаляєте кеші

rm -rf $HOME/.gradle/caches/

Ви просто очистіть усі кешовані банки і ша1 сум, і Gradle опиниться в ситуації, коли на вашій машині немає артефактів і доведеться завантажувати все. Так, це буде спрацьовувати на 100% вперше, але коли інший SNAPSHOT буде випущений і він є частиною вашого дерева залежності, вам знову доведеться зіткнутися перед вибором оновити або очистити кеші.


9

Це працювало для мене. Переконайтесь, що Gradle не встановлено в режимі офлайн, знімівши прапорець біля кнопки Файл> Налаштування> Gradle> Офлайн робота.

Додайте це до верхнього рівня свого build.gradle, приємно мати вищезалежні залежності

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

Я переконався, що мої залежності написані так:

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

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


9

Жодне з вищезазначених рішень не працювало для мене.

Якщо ви використовуєте IntelliJ, це вирішило для мене просто оновлення всіх проектів Gradle:

введіть тут опис зображення


7

Для тих, хто цікавиться, де запустити команди gradle:

  1. Відкрийте Android Studio
  2. Клацніть на терміналі (ви знайдете його в базі Android Studio)
  3. Відкриється інструмент команд
  4. Введіть свою команду gradlew build --refresh-dependencies

6

Для Android Studio 3.4.1

Просто відкрийте вкладку gradle (може бути розташована праворуч) і клацніть правою кнопкою миші на батьківському списку (слід називати "Android"), після чого виберіть "Refresh залежності".

Це має вирішити вашу проблему.


4

Mb Я запізнився, однак моє рішення призначене для одного сховища. Я думаю, що видалення ~ / .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.


2

Для оновлення кешованої версії 'release' єдина можливість - очистити локальний кеш.

rm -rf $HOME/.gradle/caches/

Щоб оновити кешовану версію "знімка", ви можете:

./gradlew build --refresh-dependencies

1

Видалення всіх кеш-пам'ять змушує знову завантажити всі залежності. так що це зайняло так багато часу, і нудно, зачекайте ще раз, щоб знову завантажити всі залежності.

Як ніколи я міг би вирішити це нижче способом.

Просто видаліть групи, які потрібно оновити.

Наприклад: якщо ми хочемо оновити групу com.user.test

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

потім видаліть залежність із build.gradle та повторно додайте її. тоді воно оновить залежності, чого ми хочемо.



0

видалити цей каталог:

C:\Users\[username]\.gradle

3
Зважаючи на те, що потенційно існують локальні конфігурації, видалення (або перейменування / переселення) каталогу кешів, як згадується в інших відповідях, є кращим рішенням.
зменшенеанімальне число

0

У більшості випадків просто спроба відновити проект повинна зробити свою справу. Іноді доводиться бігати, ./gradlew build --refresh-dependenciesяк уже було сказано кілька відповідей (це займає багато часу, залежно від того, скільки залежностей у вас є). Як ніколи, іноді жодне з них не спрацює: залежність просто не оновлюється. Потім ви можете зробити це:

  1. Видаліть залежність із файлу gradle
  2. Запустіть / налагоджуйте проект і чекайте його збою (з NonExistingClassпричиною)
  3. Натисніть «побудувати проект» та дочекайтеся його успішного завершення
  4. Запустити / налагодити ще раз

Це смішно і здається божевіллям, але я фактично використовую цю процедуру щодня, просто тому, що потрібна мені залежність може бути оновлена ​​десятки разів, і жодне з адекватних рішень не дасть жодного ефекту.


0

Ви можете це зробити так

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

Процитуйте з відключення кеш-пам’яті Gradle Build

Кеш побудови Gradle може бути чудовою справою, коли ви регулярно створюєте великі проекти з Gradle. Однак, коли лише зрідка створюються проекти з відкритим кодом>, вони можуть швидко стати великими.

Щоб відключити кеш-пам'ять збірки Gradle, додайте наступний рядок до ~/.gradle/gradle.properties

org.gradle.caching=false

Ви можете очистити наявний кеш

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

0

Якщо ви використовуєте затемнення і якщо ви хочете примусити затемнення повторно завантажувати залежності, ви можете спробувати нижче команду

gradlew clean cleaneclipse build eclipse --refresh-dependencies

2
Навіщо використовувати Eclipse? Особливо у 2018 році!
Крістофер Перрі

0

Лише ручне видалення конкретної залежності в папці кешу працює ... артефактор, побудований колегою по корпоративній репо.


0

У моєму випадку ніщо з вищезгаданого не працювало, що я робив:

  • В build.gradle, коментуючи залежність , пов'язану з недозволеним імпортом я мав
  • Натиснувши "Синхронізувати зараз"
  • Не коментуючи те, що я щойно коментував
  • Клацнувши знову "Синхронізувати"

Тоді мій імпорт знову був належним чином вирішений.


-7

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.