Почему есть разница между./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
)