Почему Wrapper Gradle должен быть привязан к VCS?

Из Gradle документации: https://docs.gradle.org/current/dsl/org.gradle.api.tasks.wrapper.Wrapper.html

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

От: Что НЕ должно быть под контролем источника?

Я думаю, что Generated files не должен находиться в VCS.

Когда нужны gradlew и gradle/gradle-wrapper.jar?

Почему бы не сохранить gradle version в файле build.gradle?

Ответ 1

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

Если бы все, что у вас было, было номером версии gradle в файле build.gradle, вам понадобится README, объясняющий всем, что версия X с градиентом должна быть загружена из URL Y и установлена, и вам придется делать это каждый раз, когда версия увеличивается.

Ответ 2

Потому что вся точка оболочки gradle должна быть в состоянии, не имея когда-либо установленной gradle

Тот же аргумент для JDK, вы также хотите зафиксировать это? Вы также передаете все ваши библиотеки зависимостей?

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

Если оболочка gradle увеличивается для каждой новой версии, и она зафиксирована, репо будет расти очень большим. Проблема очевидна при работе с распределенным VCS, где клон загружает все версии всего.

и даже не зная, как это работает

Создайте конструкцию script, которая загружает оболочку и использует ее для сборки. Всем не нужно знать, как работает script, им нужно согласиться с тем, что проект построен, выполнив его.

где скачать его, какая версия

task wrapper(type: Wrapper) {
 gradleVersion = 'X.X' 
}

И затем

gradle wrapper

Чтобы загрузить правильную версию.

чтобы клонировать проект из VCS, для выполнения градиента script, который он содержит, и для создания проекта без какого-либо дополнительного шага.

Решится по приведенным выше шагам. Загрузка оболочки gradle не отличается от загрузки любых других зависимостей. script может быть умным enaugh для проверки любой текущей оболочки gradle и только загрузить ее, если есть новая версия.

Если разработчик никогда раньше не использовал gradle и, возможно, не знал, что проект построен с помощью Gradle. Тогда его более очевидным для запуска "build.sh" по сравнению с запуском "gradlew build".

Если у вас был номер версии gradle в файле build.gradle, вам понадобится README, объясняющий всем, что gradle версия X должна быть загружена из URL Y установленного,

Нет, вам не понадобится README. У вас может быть один, но мы разработчики, и мы должны автоматизировать как можно больше. Создание script лучше.

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

Если разработчики согласятся с тем, что правильный процесс:

  • Операция клонирования
  • Запустить сборку script

Тогда обновление до последней оболочки gradle не представляет проблемы. Если версия с момента последнего запуска увеличивается, script может загрузить новую версию.

Ответ 3

Я хотел бы рекомендовать простой подход.

В вашем проекте README укажите, что требуется шаг установки, а именно:

gradle wrapper --gradle-version 3.3

Это работает с Gradle 2,4 или выше. Это создает оболочку, не требуя добавления специальной задачи в "build.gradle".

С помощью этой опции игнорировать (не проверять) эти файлы/папки для контроля версий:

  • ./gradle
  • gradlew
  • gradlew.bat

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

Ответ 4

Что такое "проект"?

Возможно, существует техническое определение этой идиомы, исключающее сценарии сборки. Но если мы примем это определение, то мы должны сказать, что ваш "проект" - это еще не все, что вам нужно для версионности!

Но если мы говорим "ваш проект", это все, что вы сделали. Тогда мы можем сказать, что вы должны включить его и только его в VCS.

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

"напрямую" означает "не косвенно", а "косвенно" означает редактирование другого файла, после чего эффект будет отражен в этом файле.

Таким образом, мы достигаем того же, что сказал OP (и сказано здесь):

Я думаю, что сгенерированные файлы не должны быть в VCS.

Да. Потому что ты их не создал. Таким образом, они не являются частью "вашего проекта" согласно второму определению.


Каков результат этих файлов:

  • build.gradle: да. Нам нужно отредактировать это. Наши работы должны быть версионными.

    Примечание: нет разницы, где вы редактируете это. Будь то в вашей среде текстового редактора или в среде Project Structure GUI. В любом случае, вы делаете это напрямую !

  • gradle-wrapper.properties: Да. Нам нужно как минимум определить версию Gradle в этом файле.

  • gradle-wrapper.jar и gradlew [.bat]: Я не создавал и не редактировал их ни в одной из своих разработок, до этого момента! Так что ответ "нет". Если вы это сделали, ответ "Да" о вас на этой работе (и о том же файле, который вы редактировали).


Важное замечание о последнем случае: пользователь, который клонирует ваше хранилище, должен выполнить эту команду в хранилище <root-directory> чтобы автоматически создавать файлы-оболочки:

> gradle wrapper --gradle-version=$v --distribution-type=$distType

$v и $distType определяются из gradle-wrapper.properties:

distributionUrl=https\://services.gradle.org/distributions/gradle-{$v}-{$distType}.zip

Смотрите https://gradle.org/install/ для получения дополнительной информации.

gradle файл gradle - это bin/gradle[.bat] в локальном дистрибутиве. Не требуется, чтобы локальное распространение было таким же, как определено в репо. После создания файлов- gradlew[.bat] может автоматически загрузить определенное распределение Gradle (если оно не существует локально). Затем он/она, вероятно, должен восстановить файлы-оболочки, используя новый исполняемый файл gradle (в загруженном дистрибутиве), используя приведенные выше инструкции.


Примечание. В приведенных выше инструкциях предполагается, что пользователь имеет как минимум один дистрибутив Gradle локально (например, ~/.gradle/wrapper/dists/gradle-4.10-bin/bg6py687nqv2mbe6e1hdtk57h/gradle-4.10). Он охватывает практически все реальные случаи. Но что произойдет, если у пользователя еще нет рассылки?

Он/она может загрузить его вручную, используя URL в файле .properties. Но если он/она не найдет его по пути, ожидаемому упаковщиком, оболочка загрузит его снова! Ожидаемый путь полностью предсказуем, но находится вне темы (самую сложную часть см. Здесь).

Есть также несколько более простых (но грязных) способов. Например, он/она может скопировать файлы оболочки (кроме файла .properties) из любого другого локального/удаленного репозитория в свой репозиторий и затем запустить gradlew в своем репозитории. Он автоматически загрузит подходящий дистрибутив.