Gradle/Eclipseプラグインで.project出力結果を変更
GradleのEclipseプラグインで作成されたEclipse用の.projectファイルの変更方法である。
クラスを特定する
以下で.projectを表現するクラスを特定できる。
eclipse {
project {
println delegate.class
}
}
結果は以下
class org.gradle.plugins.ide.eclipse.model.EclipseProject_Decorated
この_Decoratedを除く部分がクラス名である。
EclipseProject
このクラスは検索すればすぐに見つかる。Class EclipseProjectである。
以下は適当な翻訳だ。
public class EclipseProject
extends Object
Eclipseプラグインのproject詳細(.projectファイル)の微調整を可能にする。
以下は、可能なすべてのプロパティの使用例である。
注意してほしいが、通常はeclipseのprojectを直接コンフィグレーションする必要は無い。
Gradleが勝手に行うからだ。
apply plugin: 'java'
apply plugin: 'eclipse'
eclipse {
project {
// Graldeの選んだ名前が気に入らなければこうする。
name = 'someBetterName'
// Eclipseプロジェクトのコメントを指定したい場合
comment = 'Very interesting top secret project'
// 参照プロジェクトを宣言的なやり方で追加する場合
referencedProjects 'someProject', 'someOtherProject'
// 参照プロジェクトを設定する場合
referencedProjects = ['someProject'] as Set
// 宣言的やり方でnatureを追加する場合
natures 'some.extra.eclipse.nature', 'some.another.interesting.nature'
// natureをgroovy的なやり方で設定する場合
natures = ['some.extra.eclipse.nature', 'some.another.interesting.nature']
// ビルドコマンドを追加する場合
buildCommand 'buildThisLovelyProject'
// ビルドコマンドをパラメータ付で追加する場合
buildCommand 'buildItWithTheArguments', argumentOne: "I'm first", argumentTwo: "I'm second"
// ロケーションURIによって、さらなるリンクを作りたいときは、こうする。
linkedResource name: 'someLinkByLocationUri', type: 'someLinkType', locationUri: 'file://someUri'
// ロケーションの場合
linkedResource name: 'someLinkByLocation', type: 'someLinkType', location: '/some/location'
// node_modulesフォルダをEclipse内に見せたくない場合には、フィルタリングすることができる。
resourceFilter {
appliesTo = 'FOLDERS'
type = 'EXCLUDE_ALL'
matcher {
id = 'org.eclipse.ui.ide.multiFilter'
arguments = '1.0-name-matches-false-false-node_modules'
}
}
}
}
稀なケースとして、作成済のXMLファイルに対してさらなる設定をしたい場合がある。
このときにもbeforeMerged, whenMergedによって既存のコンフィギュレーションへ変更を行う道がある。
beforeMergedとwhenMergedクロージャはProjectオブジェクトを受け取る
上級コンフィギュレーションの例:
apply plugin: 'java'
apply plugin: 'eclipse'
eclipse {
project {
file {
//結果のXMLにちょっかいを出して、好きなことをする。
withXml {
def node = it.asNode()
node.appendNode('xml', 'is what I love')
}
//既存の.projectファイルがロードされた後、しかしgradleからの情報がマージされる前に実行されるクロージャ
beforeMerged { project ->
// naturesのマージをスキップしたいとき(非常に抽象的な例)
project.natures.clear()
}
//.projectファイルがロードされ、gradleのビルド情報がマージされた後に実行されるクロージャ
whenMerged { project ->
//ここでプロジェクトをいじくりまわす
}
}
}
}