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 ->
         //ここでプロジェクトをいじくりまわす
       }
     }
   }
 }