Gradle Concepts: Difference between revisions
No edit summary |
|||
Line 53: | Line 53: | ||
{{Internal|Gradle_Init_Script#Overview|Init Script}} | {{Internal|Gradle_Init_Script#Overview|Init Script}} | ||
=The Gradle Object Instance= | =The Gradle Object Instance= |
Revision as of 21:20, 17 July 2018
External
- DSL reference https://docs.gradle.org/current/dsl/
Internal
Overview
Gradle is a general-purpose build tool, which can build pretty much anything its configuration scripts declare. It is primarily used to build Java and Groovy, but it can build other languages as well.
Configuration Scripts
The configuration scripts are written in the Gradle build language, which is a DSL and a Groovy extension. A build is configured by three types of configuration scripts, which together express build requirements and inform the build runtime: build scripts, a settings script and an init script.
Each of those scripts contains executable statements and script blocks, which are a special case of executable statement, consisting in a method invocation on a closure. The statements and script blocks are executed in the order in which they are declared in the script. The logic expressed in a specific script applies to its delegate object. Though syntax is similar for all three scripts, specific blocks must make sense with the delegate object. The corresponding delegate objects for all three types of configuration scripts will be described below.
A configuration script may contain statements, script blocks, and any elements allowed in a Groovy script, such as method and class definitions.
A statement may be a method call, property assignment and local variable definition. One of the simplest possible statements, which will be executed in the order in which is found in the script, is:
println 'I am here'
If the delegate object has an accessor that follows Java Beans conventions, then the result of the accessor invocation can be obtained simply specifying the corresponding variable name. For example, the root project instance returned by:
public interface Settings ... {
ProjectDescriptor getRootProject();
}
can be accessed from the corresponding settings.gradle script with rootProject.
A script block is method call that takes a configuration closure as an argument. Executing the script block results in modification of the associated delegate object, based on the content of the closure. Equivalent terminology, often used in documentation, is to delegate the closure against the target object. This means that the closure will be executed in scope of the class of the target instance. For all Groovy closures, it is the default parameter passed to the closure. A build configuration that does not declare any plugin has a set of standard script blocks. Plugins may, and usually do, add new script blocks.
Each configuration script implements the Script interface, which exposes a number of useful methods and properties.
Settings Script and Setting Instance
Build Script and Project Instance
Init Script
The Gradle Object Instance
Projects and Multi-Project Builds
A Project is the main API to use to interact with Gradle. All top level statements within a build script are delegated to the corresponding Project instance. Multi-project builds consist of multiple Project instances.
Task
A Task represents a single atomic piece of work for a build. A build consists in executing a sequence of tasks in succession, after the task have been arranged in a directed acrylic graph. Understanding how the directed acyclic graph is built and how tasks are scheduled for execution is key to understanding how gradle works. These concepts are explained here:
Variables and Properties
Module
A module is a piece of software that evolves over time. Every module has a name, and each release of a module is identified by a module version. Modules can be hosted in repositories. Modules usually are described by module metadata, which is information associate with a module. Metadata includes coordinates for locating the module in a repository (group ID, artifact name and version), information about the module's transitive dependencies, authors, etc. In Maven, the metadata file is called POM.
A module version is a label that designates a distinct set of changes released as a unit. The most widely-used versioning strategy is semantic versioning.
Dependencies and Dependency Configurations
Configuration, in this context, does not refer to a configuration file, as in a settings configuration or a build configuration. It refers to named set of dependencies or artifacts, and it can probably thought of as being a concept similar to a Maven scope.
Repository
Plugins
Extensions
A Project implements ExtensionAware. Some plugins create extensions. For example, maven-plugin creates a "publishing" extension.
Software Component
A software components may be added by a plugin. For example the Java plugin adds a "java" component, accessible via components.java. The artifact associated with the Java component is the generated JAR file, and the dependencies are those of the runtime configurations. The War plugin adds a "web" software component whose artifact is the generated WAR file, with no dependencies.
The available components can be displayed with:
task util {
components.each { println it.name }
}
Artifacts and Artifact Publishing
Keywords: extension, classifier.
The Gradle Wrapper
Gradle Wrapper is the recommended way to execute a Gradle build. The Wrapper is a script that invokes a declared version of Gradle, downloading it beforehand if necessary.
./gradlew ...
The wrapper caches the appropriate Gradle runtime under $USER_HOME/.gradle/wrapper/dists/. Using the wrapper effectively locks a specific Gradle version to the project. Per-project graddle wrapper infrastructure can be created with gradle init.
One of the advantages of using the Gradle wrapper is that other people that attempt to build the project do not have to have Gradle installed on their system, everything Gradle needs to run comes with the wrapper.
The Gradle Daemon
Configured with "org.gradle.daemon" and "org.gradle.daemon.idletimeout" Gradle property. On by default.