Как / когда генерировать файлы оболочки Gradle?

212

Я пытаюсь понять, как работает Gradle Wrapper. Во многих репозиториях я вижу следующую структуру:

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?
smeeb
источник

Ответы:

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
    

    Все подробности можно найти здесь

3.1 --distribution-typeТакже можно использовать опцию Gradle . Опции бинарные и все и бин . все дополнительно содержит исходный код и документацию. все также лучше, когда используется IDE, поэтому редактор работает лучше. Недостатком является то, что сборка может длиться дольше (нужно загружать больше данных, бессмысленно на CI-сервере), и это займет больше места.

  1. Это файлы Gradle Wrapper. Вам необходимо сгенерировать их один раз (для конкретной версии) и добавить в систему контроля версий. Если вам нужно изменить версию Gradle Wrapper, измените версию в build.gradleразделе (1.) и создайте заново файлы.

  2. Приведите подробный пример. Такой файл может иметь несколько целей: многомодульный проект, разделение ответственности, слегка измененный сценарий и т. Д.

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

опал
источник
Спасибо @Opal (+1) - чтобы дать вам конкретный пример для # 3, см. Netflix-Eureka . Что это за файлы Gradle?!?
Смееб
Хорошо, я вижу это. Насколько я вижу, разработчики из Netflix просто разделили один большой build.gradleскрипт на несколько более коротких и посвятили себя одной конкретной цели сценариев. Как вы можете сценарий, расположенный в директории Gradle, примененный к основному 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 Wrapper

Проект сборки 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, не используйте системный gradle. Это избавит вас от многих головных болей.

./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?
Раффиан
1
Я полагаю, вы можете вернуться в 2-й серии Gradle. Я не совсем уверен, что до 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. Если вы хотите загрузить полный gradle, вы можете настроить задачу-оболочку следующим образом. :

task wrapper(type: Wrapper) {
    gradleVersion = '2.13'
    distributionUrl = distributionUrl.replace("bin", "all")
}
Geng Jiawen
источник
1
В более поздних сборках gradle (точно не знаю, какая именно) - вместо того, чтобы переписывать URL-адрес вручную, вероятно, лучше использовать встроенную команду в том же замыкании: distributionType = Wrapper.DistributionType.ALL
Дейв Берч
6

Это команда, которую нужно использовать, чтобы сказать Gradle обновить обертку так, чтобы она брала дистрибутивные версии библиотек, которые содержат исходный код:

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

Если указать тип дистрибутива с помощью «all», Gradle загрузит исходные файлы для использования вашей средой разработки.

Плюсы :

  • IDE будут иметь немедленный доступ к исходному коду. Например, Intellij IDEA не предложит вам обновить ваши сценарии сборки, чтобы включить исходный дистрибутив (потому что эта команда уже сделала это)

Минусы :

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

Пожалуйста, прокомментируйте или предоставьте другой ответ, если вам известна какая-либо опция командной строки, чтобы сказать Gradle не загружать исходные коды на сервер сборки.

Shorn
источник
1
Вы уверены, что этот параметр относится к библиотекам? Официальные документы говорят иначе и относятся только к самой оболочке: «Тип дистрибутива Gradle, который будет использоваться оболочкой». docs.gradle.org/current/dsl/… ...
Торстен
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, если вам нравится, и вы чувствуете, что они будут более понятными таким образом.

dlamblin
источник
2

Поскольку встроенные задачи Gradle устарели в 4.8, попробуйте ниже

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

и беги

gradle wrapper
drafterr
источник