Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is there a difference between ./gradlew clean build and ./gradlew clean :build

Tags:

gradle

gradlew

I have the following situation:

I have a project with several subprojects. Today I tried to build the projects with gradle via command line.

The build was successful when I executed ./gradlew clean :build, but not with ./gradlew clean build. It causes different errors, depending on which subprojects are activated. Why is that? Shouldn't it be the same?

Both commands are executed directly after each other, without changes in the code, and from the same directory (the base-directory, where settings.gradle is located.

The gradle-refresh of Intellij works, the build is successful (but fails on our build server, if that is relevant).

According to the documentation https://docs.gradle.org/current/userguide/command_line_interface.html#executing_tasks_in_multi_project_builds I assumed that it would do the same, since no subproject is specified, and the build task is executed for all submodules. There is no folder called build in the root project, so this should not cause confusion. Am I interpreting it wrong?

I searched online, however, I could not find the result, since : is is not recognized by most search engines, and colon leads to not relevant results like What is the colon operator in Gradle?.

The gradle version is 4.10.2

If you need more information, please let me know.

like image 319
Thomas Böhm Avatar asked Dec 17 '22 19:12

Thomas Böhm


1 Answers

There is a difference between ./gradlew clean :build and ./gradlew clean build, that's why you have a different behavior: in the first case you are using qualified task name, in the other case you are using simple task name. These documentations here and here explain these two approaches for executing tasks:

  • Using simple task name ( ./gradlew test) :

The first approach is similar to the single-project use case, but Gradle works slightly differently in the case of a multi-project build. The command gradle test will execute the test task in any subprojects, relative to the current working directory, that have that task. So if you run the command from the root project directory, you’ll run test in api, shared, services:shared and services:webservice. If you run the command from the services project directory, you’ll only execute the task in services:shared and services:webservice.

=> so executing ./gradlew build in the root project directory will trigger execution of build task for root project and all subprojects

  • Using qualified task name ( ./gradlew :build)

For more control over what gets executed, use qualified names (the second approach mentioned). These are paths just like directory paths, but use ‘:’ instead of ‘/’ or ‘\’. If the path begins with a ‘:’, then the path is resolved relative to the root project. In other words, the leading ‘:’ represents the root project itself. All other colons are path separators.

=> executing ./gradlew :build , you will execute "only" the build task for rootProject

As I said in comment, you migth have some issues in one or more of your subproject, but you will not see these errors if you execute only Root project build ( ./gradlew :build )

like image 125
M.Ricciuti Avatar answered May 11 '23 11:05

M.Ricciuti