Як / коли генерувати файли обгортки Gradle?


212

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

projectRoot/
    src/
    build.gradle
    gradle.properties
    settings.gradle
    gradlew
    gradlew.bat
    gradle/
        wrapper/
            gradle-wrapper.jar
            gradle-wrapper.properties

Мої запитання:

  1. Як / коли генерує gradlew/ gradlew.bat? Чи маєте ви генерувати їх лише один раз, коли проект вперше створений, чи створюєте ви їх щоразу, коли ви здійснюєте / наштовхуєте зміни? І як вони генеруються?
  2. Те саме питання вище, але для gradle/wrapper/*файлів ( gradle-wrapper.jarі gradle-wrapper.properties)?
  3. Інколи я бачу інші *.gradleфайли всередині gradleкаталогу проекту . Що це за додаткові файли Gradle і що вони представляють / роблять? Спеціальні плагіни?
  4. Яка різниця у властивостях, що входять у settings.gradleпорівняння з тим, що слід визначити всередині gradle.properties?

Відповіді:


251
  1. Ви генеруєте його один раз і знову, коли ви хочете змінити версію Gradle, яку ви використовуєте в проекті. Не потрібно генерувати так часто. Ось документи. Просто додайте wrapperзавдання у build.gradleфайл та запустіть це завдання, щоб отримати структуру обгортки.

    Майте на увазі, що вам потрібно встановити Gradle для створення обгортки. Прекрасним інструментом управління артефактами g-екосистеми є SDKMAN! . Щоб створити обгортку gradle, додайте у build.gradleфайл наступний фрагмент коду :

    task wrapper(type: Wrapper) {
       gradleVersion = '2.0' //version required
    }
    

    і біжи:

    gradle wrapper
    

    завдання. Додайте отримані файли до SCM (наприклад, git) і відтепер усі розробники матимуть однакову версію Gradle при використанні Gradle Wrapper.

    За допомогою Gradle 2.4 (або вище) ви можете налаштувати обгортку, не додаючи спеціального завдання:

    gradle wrapper --gradle-version 2.3
    

    або

    gradle wrapper --gradle-distribution-url https://myEnterpriseRepository:7070/gradle/distributions/gradle-2.3-bin.zip
    

    Усі подробиці можна знайти тут

З Gradle 3.1 --distribution-typeваріант також може бути використаний. Варіанти - двійкові та всі та бін . все додатково містить вихідний код та документацію. все також краще, коли використовується IDE, тому редактор працює краще. Недолік - збірка може тривати довше (потрібно завантажувати більше даних, безглуздо на сервері CI), і це займе більше місця.

  1. Це файли Gradle Wrapper. Їх потрібно генерувати один раз (для певної версії) та додати до контролю версій. Якщо вам потрібно змінити версію Gradle Wrapper, змініть її в build.gradleдив. (1.) та відновіть файли.

  2. Наведіть докладний приклад. Такий файл може мати декілька цілей: багатомодульний проект, розділення відповідальності, трохи змінений сценарій тощо.

  3. settings.gradleвідповідає швидше за структуру проекту (модулі, імена тощо), тоді gradle.propertiesяк використовується для зовнішніх деталей проекту та Gradle (версія, аргументи командного рядка -XX, властивості тощо)


Дякуємо @Opal (+1) - щоб дати конкретний приклад №3, див. Netflix-Eureka . Що це за файли Gradle?!?
smeeb

Гаразд, я це бачу. Наскільки я бачу, розробники Netflix просто розділили один великий build.gradleскрипт на кілька коротших та присвятили одному сценарію конкретної мети. Оскільки сценарій, розташований під gradle dir, застосований до основного build.gradleфайлу, перегляньте: github.com/Netflix/eureka/blob/master/build.gradle . Де ви розміщуєте такі модулі, це ваш вибір. Це все загалом. Якщо ви задоволені відповіддю, будь ласка, прийміть відповідь :)
Опал

1
Інший корисний варіант командного рядка --distribution-type, наприклад,gradle wrapper --gradle-version 4.3.1 --distribution-type ALL
heenenee

1
Дякую @heenenee, додасть це до моєї відповіді.
Опал

Порада: Android Studio має в своєму папці інсталяції Gradle.
TWiStErRob

29

Генерування обгортки Gradle

Проект побудови граду

// Top-level build file where you can add configuration options common to all sub-projects/modules.

// Running 'gradle wrapper' will generate gradlew - Getting gradle wrapper working and using it will save you a lot of pain.
task wrapper(type: Wrapper) {
    gradleVersion = '2.2' 
}

// Look Google doesn't use Maven Central, they use jcenter now.
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

Потім у командному рядку запустіть

gradle wrapper

Якщо вам не вистачає gradle у вашій системі, встановіть його або вищезгадане не працюватиме. На Mac найкраще встановлювати через Homebrew.

brew install gradle

Після того, як ви успішно виконали завдання для обгортки та згенерували gradlew, не використовуйте системну градацію. Це позбавить вас від багатьох головних болів.

./gradlew assemble

Що з плагіном gradle, який ви бачили вище?

com.android.tools.build:gradle:1.0.1

Ви повинні встановити версію як найновішу, і ви можете перевірити сторінку інструментів і відредагувати версію відповідно.

Подивіться, що створює Android Studio

Додавання gradle та новітньої Android Studio кардинально змінили макет проекту. Якщо у вас є старіший проект, я настійно рекомендую створити чистий з найсвіжішою Android Studio і подивитися, що Google вважає стандартним проектом.

Android Studio має можливості для імпорту старих проектів, що також може допомогти.


gradleVersion = '2.2'я taskWrapperможу використовувати будь-яку версію, яку я бажаю для створення обгортки, правильно? Чи не повинна бути остання версія gradle?
raffian

1
Я припускаю, що ви можете повернутися в 2-й серії градулей. Я зовсім не впевнений в 2.x, але ні, не потрібно дотримуватися абсолютної останньої версії.
Камерон Лоуелл Палмер

18

З Gradle 2.4 ви можете використовувати gradle wrapper --gradle-version X.Xдля налаштування конкретної версії обгортки Gradle, не додаючи до build.gradleфайлу жодних завдань . Наступного разу, коли ви використовуєте обгортку, вона завантажить відповідний розподіл Gradle, щоб відповідати.


10

Якщо ви хочете завантажити gradle з джерелом та документами, URL-адреса розповсюдження за замовчуванням, налаштована у gradle-wrapper.properites, не задовольнить ваші потреби. Це https://services.gradle.org/distributions/gradle-2.10-bin.zip , не https://services.gradle.org/distributions/gradle-2.10-all.zip . Цю повну URL-адресу запропоновано IDE, наприклад, Android Studio. Якщо ви хочете завантажити повний градул, ви можете налаштувати завдання обгортки, як це :

task wrapper(type: Wrapper) {
    gradleVersion = '2.13'
    distributionUrl = distributionUrl.replace("bin", "all")
}

1
З більш новими побудовами gradle (не впевнений, який саме) - замість того, щоб переписати URL-адресу вручну, можливо, найкраще використовувати вбудовану команду в тому ж самому закритті: distributionType = Wrapper.DistributionType.ALL
Дейв Береза

6

Це команда, яку слід використовувати Gradle, щоб оновити обгортку таким чином, що вона захопить версії розповсюдження бібліотек, що включає вихідний код:

./gradlew wrapper --gradle-version <version> --distribution-type all

Визначаючи тип розподілу за допомогою "усіх", Gradle завантажить вихідні файли для використання у вашому середовищі розробки.

Плюси :

  • IDE матимуть негайний доступ до вихідного коду. Наприклад, Intellij IDEA не запропонує вам оновити свої сценарії збирання, щоб вони містили вихідний дистрибутив (оскільки ця команда вже зробила це)

Мінуси :

  • Більш довгий / більший процес збирання, оскільки він завантажує вихідний код. Це витрата часу / простору на сервері збірки або CI, де вихідний код не потрібен.

Будь ласка, прокоментуйте або надайте іншу відповідь, якщо вам відомо про будь-який варіант командного рядка, щоб сказати Gradle не завантажувати джерела на сервер збірки.


1
Ви впевнені, що це налаштування стосується бібліотек? Офіційні документи говорять інакше і посилаються тільки на саму обгортку: "Тип розподілу Gradle, який повинен використовувати обгортку". docs.gradle.org/current/dsl/…
Thorsten

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

    Найпростіший спосіб оновлення: станом на Gradle 2.2 ви можете просто завантажити та витягнути повний або двійковий розподіл Gradle та запустити:

    $ <pathToExpandedZip>/bin/gradle wrapper
    

    Не потрібно визначати завдання, хоча вам, певно, потрібен якийсь build.gradleфайл.

    Це дозволить оновити або створити gradlewі gradlew.batобгортку, і, gradle/wrapper/gradle-wrapper.propertiesі, gradle-wrapper.jarщоб надати поточну версію gradle, загорнуту.

  2. Це всі частини обгортки.

  3. Деякі build.gradleфайли посилаються на інші файли або файли у підкаталогах, які є підпроектами або модулями. Це стає трохи складніше, але якщо у вас є один проект, вам в основному потрібен один файл.

  4. settings.gradleобробляє проекти, модулі та інші види імен та налаштувань, gradle.propertiesналаштовує змінні, що використовуються для повторного використання для файлів gradle, якщо вам це подобається, і ви вважаєте, що вони будуть зрозумілішими таким чином.


2

Оскільки вбудовані завдання gradle застаріли в 4.8, спробуйте нижче

wrapper {
   gradleVersion = '2.0' //version required
}

і біжи

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