Gradle provides a powerful mechanism to allow customizing the build based on the current environment. This mechanism also supports tools that wish to integrate with Gradle.
Gradleは、実行環境に合わせてビルドをカスタマイズするためのパワフルな仕組みを提供しています。また、この仕組みにより、外部ツールがGradleを統合して使用するのを手助けします。
Note that this is completely different from the “init
” task
provided by the “build-init
” incubating plugin (see Chapter 47, Build Init Plugin).
Initialization scripts (a.k.a. init scripts) are similar to other scripts in Gradle. These scripts, however, are run before the build starts. Here are several possible uses: 初期化スクリプト(init scripts)は、Gradleで使う他のスクリプトと似たものですが、ビルドの開始前に実行されます。使用する場面としては次のようなものがあります。
Set up enterprise-wide configuration, such as where to find custom plugins.
企業内で適用される設定、たとえば、カスタムプラグインのダウンロード先などを設定する。
Set up properties based on the current environment, such as a developer's machine vs. a continuous integration server.
実行環境に依るプロパティをセットする。たとえば、開発者のマシンとインテグレーションサーバーで異なるプロパティをセットする。
Supply personal information about the user that is required by the build, such as repository or database authentication credentials.
ビルド時に要求される、ユーザーの個人情報をセットする。リポジトリやデータベースの認証情報など。
Define machine specific details, such as where JDKs are installed.
マシン固有の情報を定義する。JDKのインストール場所など。
Register build listeners. External tools that wish to listen to Gradle events might find this useful.
ビルドのリスナーを登録する。Gradleのイベントをリスンしたい外部ツールにとって便利かもしれません。
Register build loggers. You might wish to customize how Gradle logs the events that it generates.
ビルドのロガーを登録する。Gradleがイベントを記録する方法をカスタマイズしたいことがあるかもしれません。
One main limitation of init scripts is that they cannot access classes in the buildSrc
project (see
「buildSrc
プロジェクトのソースをビルドするBuild sources in the buildSrc
project」 for details of this feature).
初期化スクリプトの主な制限は、buildSrc
プロジェクトにアクセスできないことです(この機能の詳細は「buildSrc
プロジェクトのソースをビルドするBuild sources in the buildSrc
project」を参照してください)。
There are several ways to use an init script:
初期化スクリプトを使うには、いくつかの方法があります。
Specify a file on the command line. The command line option is -I
or --init-script
followed
by the path to the script. The command line option can appear more than once, each time adding another init script.
コマンドラインでファイルを指定する。-I
か--init-script
オプションに初期化スクリプトのパスを渡します。このオプションを複数並べて、初期化スクリプトを追加していくこともできます。
Put a file called init.gradle
in the
directory.USER_HOME
/.gradle/
init.gradle
という名前のファイルを
ディレクトリに置く。USER_HOME
/.gradle/
Put a file that ends with .gradle
in the
directory.USER_HOME
/.gradle/init.d/
.gradle
という拡張子のファイルを
ディレクトリに置く。USER_HOME
/.gradle/init.d/
Put a file that ends with .gradle
in the
directory, in the Gradle distribution. This allows you to package up a custom Gradle distribution containing some custom build logic and plugins. You can
combine this with the Gradle wrapper as a way to make custom logic available to all builds
in your enterprise.
GRADLE_HOME
/init.d/
.gradleという拡張子のファイルを
ディレクトリ、つまりGradleのディストリビューションの中に置く。この機能により、独自のビルドロジックとプラグインを入れたカスタムのGradleディストリビューションを作成できます。このカスタムディストリビューションとGradleラッパー機能を組み合わせれば、企業内のすべてのビルドで独自のビルドロジックを使えるようにもできます。GRADLE_HOME
/init.d/
If more than one init script is found they will all be executed, in the order specified above. Scripts in a given directory are executed in alphabetical order. This allows, for example, a tool to specify an init script on the command line and the user to put one in their home directory for defining the environment and both scripts will run when Gradle is executed.
複数の初期化スクリプトが見つかった場合、そのすべてが上で記載した順番で実行されます。同じディレクトリのスクリプトはアルファベット順に実行されます。これにより、たとえば、ツールがコマンドラインで初期化スクリプトを指定し、ユーザーはホームディレクトリに環境設定のためのスクリプトを置いて、ビルド時にその両方を実行する、といったことが可能です。
Similar to a Gradle build script, an init script is a Groovy script. Each init script has a
Gradle
instance associated with it. Any property reference
and method call in the init script will delegate to this Gradle
instance.
Gradleのビルドスクリプトと同様、初期化スクリプトもGroovyスクリプトです。すべての初期化スクリプトにGradle
のインスタンスが割り当てられ、初期化スクリプト内でのプロパティアクセス、メソッドコールはすべてこのGradle
インスタンスに委譲されます。
Each init script also implements the Script
interface.
また、すべての初期化スクリプトはScript
インターフェースを実装しています。
You can use an init script to configure the projects in the build. This works in a similar way to configuring projects in a multi-project build. The following sample shows how to perform extra configuration from an init script before the projects are evaluated. This sample uses this feature to configure an extra repository to be used only for certain environments.
初期化スクリプトを使ってプロジェクトの設定を変更することができます。これは、マルチプロジェクトでプロジェクトの設定を変更する方法と同じように動作します。次のサンプルは、プロジェクトが評価される前に、初期化スクリプトで追加的な設定を行うための方法を示すものです。このサンプルでは、ある環境でのみ使用する特別なリポジトリを設定しています。
例61.1 プロジェクト評価前に初期化スクリプトで追加的な設定を行う
build.gradle
repositories {
mavenCentral()
}
task showRepos << {
println "All repos:"
println repositories.collect { it.name }
}
init.gradle
allprojects { repositories { mavenLocal() } }
gradle --init-script init.gradle -q showRepos
の出力
> gradle --init-script init.gradle -q showRepos All repos: [MavenLocal, MavenRepo]
In 「ビルドスクリプトで外部ライブラリを使うときの依存関係設定External dependencies for the build script」 it is was explained how to add external dependencies to a
build script. Init scripts can also declare dependencies. You do this with the
initscript()
method, passing in a closure which declares the init script classpath.
「ビルドスクリプトで外部ライブラリを使うときの依存関係設定External dependencies for the build script」でビルドスクリプトに依存関係を追加する方法が解説されていますが、初期化スクリプトでも似たような方法で依存関係を定義できます。初期化スクリプトに依存関係を追加するには、initscript()
メソッドに初期化スクリプトのクラスパスを宣言したクロージャを引き渡してください。
例61.2 初期化スクリプトの外部依存関係定義
init.gradle
initscript { repositories { mavenCentral() } dependencies { classpath group: 'org.apache.commons', name: 'commons-math', version: '2.0' } }
The closure passed to the initscript()
method configures a
ScriptHandler
instance. You declare the init script
classpath by adding dependencies to the classpath
configuration. This is the same way
you declare, for example, the Java compilation classpath. You can use any of the dependency types described
in 「依存関係の定義方法 How to declare your dependencies」, except project dependencies.
initscript()
に渡したクロージャは、ScriptHandler
インスタンスを設定します。これは、たとえば、Javaのコンパイルクラスパスを宣言するのと同じ方法です。「依存関係の定義方法 How to declare your dependencies」に載っている依存関係は、プロジェクト依存関係を除いてすべて使うことができます。
Having declared the init script classpath, you can use the classes in your init script as you would any other classes on the classpath. The following example adds to the previous example, and uses classes from the init script classpath.
このようにして初期化スクリプトのクラスパスを宣言すれば、初期化スクリプト内でどんなクラスでもインポートできます。次の例では、前の例に加えて、クラスパスからクラスをインポートして使用しています。
例61.3 外部依存関係を持つ初期化スクリプト
init.gradle
import org.apache.commons.math.fraction.Fraction initscript { repositories { mavenCentral() } dependencies { classpath group: 'org.apache.commons', name: 'commons-math', version: '2.0' } } println Fraction.ONE_FIFTH.multiply(2)
gradle --init-script init.gradle -q doNothing
の出力
> gradle --init-script init.gradle -q doNothing 2 / 5
Similar to a Gradle build script or a Gradle settings file, plugins can be applied on init scripts.
例61.4 Using plugins in init scripts
init.gradle
apply plugin:EnterpriseRepositoryPlugin class EnterpriseRepositoryPlugin implements Plugin<Gradle> { private static String ENTERPRISE_REPOSITORY_URL = "https://repo.gradle.org/gradle/repo" void apply(Gradle gradle) { // ONLY USE ENTERPRISE REPO FOR DEPENDENCIES gradle.allprojects{ project -> project.repositories { // Remove all repositories not pointing to the enterprise repository url all { ArtifactRepository repo -> if (!(repo instanceof MavenArtifactRepository) || repo.url.toString() != ENTERPRISE_REPOSITORY_URL) { project.logger.lifecycle "Repository ${repo.url} removed. Only $ENTERPRISE_REPOSITORY_URL is allowed" remove repo } } // add the enterprise repository maven { name "STANDARD_ENTERPRISE_REPO" url ENTERPRISE_REPOSITORY_URL } } } } }
build.gradle
repositories{
mavenCentral()
}
task showRepositories << {
repositories.each{
println "repository: ${it.name} ('${it.url}')"
}
}
gradle -q -I init.gradle showRepositories
の出力
> gradle -q -I init.gradle showRepositories repository: STANDARD_ENTERPRISE_REPO ('https://repo.gradle.org/gradle/repo')
The plugin in the init script ensures that only a specified repository is used when running the build.
When applying plugins within the init script, Gradle instantiates the plugin and calls the plugin
instance's Plugin.apply()
method. The gradle
object is passed as a parameter,
which can be used to configure all aspects of a build.
Of course, the applied plugin can be resolved as an external dependency as described in 「初期化スクリプトの外部依存関係External dependencies for the init script」