Gradle Project and Build Script: Difference between revisions

From NovaOrdis Knowledge Base
Jump to navigation Jump to search
 
(21 intermediate revisions by the same user not shown)
Line 1: Line 1:
=External=
=DEPLETE TO=
 
{{Internal|Gradle Project|Gradle Project}}
* https://docs.gradle.org/current/dsl/org.gradle.api.Project.html
* Build script structure https://docs.gradle.org/current/dsl/#N10060
* https://docs.gradle.org/current/userguide/writing_build_scripts.html
 
=Internal=
 
* [[Gradle_Concepts#Build_Lifecycle_and_Gradle_Objects|Gradle Concepts]]


=Overview=
=Overview=
Line 24: Line 17:


The project is a collection of [[Gradle Task#Overview|tasks]].
The project is a collection of [[Gradle Task#Overview|tasks]].
=Example=
<syntaxhighlight lang='groovy'>
apply plugin: 'java'
group = "io.example.gradle"
version = "1.0"
repositories {
    mavenLocal()
    mavenCentral()
}
configurations.all {
    resolutionStrategy.cacheChangingModulesFor 3600, 'seconds'
}
dependencies {
    implementation 'org.slf4j:slf4j-api:1.7.12'
    testImplementation 'junit:junit:4.+'
}
configurations {
    testImplementation.exclude group: 'com.example'
}
compileJava {
    options.compilerArgs += ['-Xlint']
}
javadoc {
    options.charSet = 'UTF-8'
}
task runMain(type: JavaExec) {
    classpath = sourceSets.main.runtimeClasspath
    main = "io.novaordis.playground.gradle.java.Main"
}
</syntaxhighlight>
=Comments=
<syntaxhighlight lang='groovy'>
// This is a comment
</syntaxhighlight>
=Project Coordinates=
Gradle reads and builds artifacts that are compatible with Maven repositories, so they are described by [[Maven_Concepts#Maven_Coordinates|Maven project coordinates]]. Project coordinates [[#Project_Name.2C_artifactId|artifactId]], [[#Group.2C_groupId|groupId]] and [[#Version|version]] can be read or set in the [[Gradle_Settings_Script_and_Settings_Instance#Overview|settings configuration file]] via the [[Gradle_Settings_Script_and_Settings_Instance#ProjectDescriptor_-_Access_to_Projects_from_Settings|ProjectDescriptor]] interface, or in the build configuration file, described by this article, via the [https://docs.gradle.org/current/dsl/org.gradle.api.Project.html Project] interface. These details apply to single project builds and [[#Multi-Project_Builds|multi-project builds]].
===Project Name, artifactId===
The project's 'name' property contains by default the name of the project's directory. It automatically becomes the '''project's name coordinate'''. The Gradle project name is equivalent with Maven [[Maven_Concepts#Artifact_ID|artifactId]].
The project name can only be set in the [[Gradle_Concepts#Initialization|initialization phase]], in the [[Gradle_Settings_Script_and_Settings_Instance#Overview|settings configuration file]], via the [[Gradle_Settings_Script_and_Settings_Instance#ProjectDescriptor_-_Access_to_Projects_from_Settings|ProjectDescriptor]] interface. An attempt to set the project name in the [[Gradle_Concepts#Configuration|configuration]] phase or [[Gradle_Concepts#Execution|execution]] phase via the Project interface, for both single, root or sub-project will trigger a Gradle execution error. It can be changed as follows:
<syntaxhighlight lang='groovy'>
rootProject.name = 'something'
...
project(':subproject-A').name = "something else"
</syntaxhighlight>
though it is probably a good idea to leave sub-projects to be named by their host sub-directories.
The default behavior is to assign the project name to the artifactId, so if you plan to publish the project with a [[Gradle_Maven_Publish_Plugin#Overview|Maven plugin]], the name should be a valid Maven identifier ([A-Za-z0-9_\-.]+). Alternatively, the non-conforming project name can be kept, but artifactId must be overridden in the [[Gradle_Maven_Publish_Plugin#Maven_Project_Coordinates|Maven publishing plugin configuration]].
===Group, groupId===
The Gradle project group is equivalent with Maven [[Maven_Concepts#Group_ID|groupId]]. The group may be set in the [[Gradle_Concepts#Configuration|configuration]] phase, in the build configuration file, as shown below. It may not be set in the [[Gradle_Concepts#Initialization|initialization]] phase in the settings configuration file, because [[Gradle_Settings_Script_and_Settings_Instance#ProjectDescriptor_-_Access_to_Projects_from_Settings|ProjecteDescriptor]] does not expose a group.
<syntaxhighlight lang='groovy'>
project.group = 'io.example'
</syntaxhighlight>
or
<syntaxhighlight lang='groovy'>
group = 'io.example'
</syntaxhighlight>
For sub-project, the group that is not explicitly set defaults to the name of the parent and it can be set either in the sub-project's build.gradle as shown above, or in the root build.gradle as follows:
<syntaxhighlight lang='groovy'>
project(':subproject-A').group = "io.something"
</syntaxhighlight>
If set in both places, the sub-project collocated build.gradle value takes precedence, as it is "closer" to the project.
If all sub-projects should inherit root's group, this can be set up in the root build.gradle as follows:
<syntaxhighlight lang='groovy'>
subprojects {
    group = rootProject.group;
// group = parent.group;
}
</syntaxhighlight>
===Version===
The version, equivalent to Maven's [[Maven_Concepts#Version|version]]  may be set in the [[Gradle_Concepts#Configuration|configuration]] phase, in the build configuration file, as shown below. It may not be set in the [[Gradle_Concepts#Initialization|initialization]] phase in the settings configuration file, because [[Gradle_Settings_Script_and_Settings_Instance#ProjectDescriptor_-_Access_to_Projects_from_Settings|ProjecteDescriptor]] does not expose a version.
<syntaxhighlight lang='groovy'>
project.version = '1.0'
</syntaxhighlight>
or
<syntaxhighlight lang='groovy'>
version = '1.0'
</syntaxhighlight>
For sub-project, the version is undefined if not explicitly set as shown below. There is no default, and no inheritance of the parent project version value. To set it, the sub-project's build.gradle as shown:
<syntaxhighlight lang='groovy'>
version = '2.0'
</syntaxhighlight>
or
<syntaxhighlight lang='groovy'>
version = parent.version
</syntaxhighlight>
Alternatively, the version can be set in the root build.gradle:
<syntaxhighlight lang='groovy'>
project(':subproject-A').version = '2.0'
</syntaxhighlight>
or
<syntaxhighlight lang='groovy'>
project(':subproject-A').version = version
</syntaxhighlight>
If set in both places, the sub-project collocated build.gradle value takes precedence, as it is "closer" to the project.
f all sub-projects should inherit root's version, this can be set up in the root build.gradle as follows:
<syntaxhighlight lang='groovy'>
subprojects {
    version = rootProject.version;
    // version = parent.version;
}
</syntaxhighlight>
==<span id='Variables_and_Properties'></span>Other Project Properties==
{{Internal|Gradle Project Properties#Overview|Project Properties}}


=Top-Level Script Blocks=
=Top-Level Script Blocks=
Line 185: Line 31:


{{Internal|Gradle_Multi-Project_Builds#subprojects|subprojects{...} usage examples}}
{{Internal|Gradle_Multi-Project_Builds#subprojects|subprojects{...} usage examples}}
==artifacts{}==
==buildscript{}==
Used to specify external plugins:
{{Internal|Gradle_Plugins#External_Plugins|External Plugins}}
==configurations{}==
Configures the dependencies configurations of this project. More details available in: {{Internal|Gradle_Dependencies_and_Dependency_Configurations#Dependency_Configuration|Gradle Dependencies and Dependency Configurations}}
==dependencies{}==
Declare the dependencies of the project. For more details see: {{Internal|Gradle_Dependencies_and_Dependency_Configurations#Declaring_Dependencies|Gradle Dependencies and Dependency Configurations}}


==repositories{}==
==repositories{}==


Used to declare and configure the repositories associated with this project. The repositories declared here will only be used to pull dependencies from, not publish against. For details on how to specify publishing repositories, see [[Gradle_Artifact_Publishing_Concepts#Overview|Gradle Artifact Publishing]]. This method executes the given configuration closure against the [https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.dsl.RepositoryHandler.html RepositoryHandler] for this project, which is passed to the closure as the closure's delegate. More details on on repositories and how to configured them are available in: {{Internal|Gradle Repositories#Overview|Gradle Repositories}}
Used to declare and configure the repositories associated with this project. The repositories declared here will only be used to pull dependencies from, not publish against. For details on how to specify publishing repositories, see [[Gradle_Artifact_Publishing_Concepts#Overview|Gradle Artifact Publishing]]. This method executes the given configuration closure against the [https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.dsl.RepositoryHandler.html RepositoryHandler] for this project, which is passed to the closure as the closure's delegate. More details on on repositories and how to configured them are available in: {{Internal|Gradle Repositories#Overview|Gradle Repositories}}
==sourceSets{}==
==publishing{}==


=Project's Containers and Handlers=
=Project's Containers and Handlers=
Line 219: Line 45:
** <span id='Publications_Container'></span>[[Gradle_Maven_Publish_Plugin#Mechanics|Publications Container]]
** <span id='Publications_Container'></span>[[Gradle_Maven_Publish_Plugin#Mechanics|Publications Container]]
** <span id='Publishing_Repository_Container'>[[Gradle_Maven_Publish_Plugin#Mechanics|Publishing Repository Container]]
** <span id='Publishing_Repository_Container'>[[Gradle_Maven_Publish_Plugin#Mechanics|Publishing Repository Container]]
=Multi-Project Builds=
{{Internal|Gradle Multi-Project Builds#Overview|Gradle Multi-Project Builds}}


=Reacting to Build Lifecycle Events=
=Reacting to Build Lifecycle Events=

Latest revision as of 09:51, 22 October 2020

DEPLETE TO

Gradle Project

Overview

A Project is the main API to use to interact with Gradle. All top level statements within a "build.gradle" build script are delegated to the corresponding Project instance and when executed, modify its state. The build.gradle configuration script is written in the Gradle DSL and it may contain any Groovy language element, variable declarations, script blocks, etc. Groovy single-quoted and double-quoted string literals can be used. The main difference is that double-quoted String literals support String interpolation.

In case of a multi-project build, It is possible to configure a project build from another build script associated with any project in the hierarchy. This capability is called cross-project configuration. Gradle implements cross-project configuration via configuration injection. Configuration injection is the default way to define common behavior.

build.gradle can be created automatically on project setup with gradle init. To make build scripts more concise, Gradle automatically adds the set of default Gradle import statements to the script.

The default name of the build script is "build.gradle" and in most cases there is no need to change it. It can be changed, though, in settings.gradle by setting the "buildFileName" property of the ProjectDescriptor associated with the project whose build script name we want to change:

project(':projectA').buildFileName = 'projectA.gradle'

The project is a collection of tasks.

Top-Level Script Blocks

allprojects{}

Applies the given configuration closure, in order, to the current project and all of its sub-projects.

allprojects{...} usage examples

subprojects{}

Applies the given configuration closure, in order, to all sub-projects of the current project.

subprojects{...} usage examples

repositories{}

Used to declare and configure the repositories associated with this project. The repositories declared here will only be used to pull dependencies from, not publish against. For details on how to specify publishing repositories, see Gradle Artifact Publishing. This method executes the given configuration closure against the RepositoryHandler for this project, which is passed to the closure as the closure's delegate. More details on on repositories and how to configured them are available in:

Gradle Repositories

Project's Containers and Handlers

https://docs.gradle.org/current/dsl/#N10272

Reacting to Build Lifecycle Events

A build lifecycle can be reacted to with code similar to the following examples.

More research necessary.

allprojects {
      afterEvaluate { project ->
          if (project.hasTests) {
              println "Adding test task to $project"
              project.task('test') {
                   doLast {
                         println "running tests for $project"
                   }
              }
          }
     }
}
gradle.afterProject {project, projectState ->
      if (projectState.failure) {
          println "Evaluation of $project FAILED"
      } 
      else {
          println "Evaluation of $project succeeded"
      }
}

Text Execution Configuration

Test Execution Configuration