Почему есть разница между./gradlew clean build и./gradlew clean:build

У меня следующая ситуация:

У меня есть проект с несколькими подпроектами. Сегодня я попытался построить проекты с Gradle через командную строку.

Сборка была успешной, когда я выполнил ./gradlew clean :build, но не с ./gradlew clean build, Это вызывает разные ошибки, в зависимости от того, какие подпроекты активированы. Это почему? Разве это не должно быть то же самое?

Обе команды выполняются непосредственно друг за другом, без изменений в коде и из одного и того же каталога (базовый каталог, где settings.gradle расположен.

Обновление Gradle Intellij работает, сборка успешна (но не на нашем сервере сборки, если это уместно).

В соответствии с документацией https://docs.gradle.org/current/userguide/command_line_interface.html я предположил, что он будет делать то же самое, поскольку подпроект не указан, и задача сборки выполняется для всех подмодулей. Там нет папки с именем build в корневом проекте, так что это не должно вызывать путаницу. Я неправильно это понимаю?

Я искал в Интернете, однако, я не мог найти результат, так как : это не признается большинством поисковых систем, и colon приводит к не релевантным результатам, таким как Что такое оператор двоеточия в Gradle?,

Версия Gradle - 4.10.2

Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

1 ответ

Решение

Есть разница между ./gradlew clean :build а также ./gradlew clean buildВот почему у вас другое поведение: в первом случае вы используете полное имя задачи, во втором - простое имя задачи. Эти документы здесь и здесь объясняют эти два подхода для выполнения задач:

  • Используя простое имя задачи (./gradlew test):

Первый подход аналогичен сценарию использования с одним проектом, но в случае многопроектной сборки Gradle работает несколько иначе. Команда gradle test выполнит тестовое задание в любых подпроектах, относящихся к текущему рабочему каталогу, которые имеют эту задачу. Поэтому, если вы запустите команду из корневого каталога проекта, вы запустите test в api, shared, services:shared и services:webservice. Если вы запустите команду из каталога проекта services, вы будете выполнять ее только в services: shared и services:webservice.

=> так выполняется ./gradlew build в корневом каталоге проекта будет запускать выполнение build задание для корневого проекта и всех подпроектов

  • Используя квалифицированное имя задачи (./gradlew :build)

Для большего контроля над тем, что выполняется, используйте квалифицированные имена (упомянутый второй подход). Это такие же пути, как и пути к каталогам, но используйте ":" вместо "/" или "\". Если путь начинается с ":", то путь разрешается относительно корневого проекта. Другими словами, ведущий ':' представляет сам корневой проект. Все остальные двоеточия являются разделителями пути.

=> выполнение ./gradlew :build, вы выполните "только" build задача для rootProject

Как я сказал в комментарии, у вас есть некоторые проблемы в одном или нескольких ваших подпроектах, но вы не увидите этих ошибок, если будете выполнять только сборку корневого проекта (./gradlew :build)

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