ビルドの種類
新規ビルダーの定義を行った際,ビルダーのクラスの中でbuildメソッドが登場した。そのメソッドのシグネチャは,
protected IProject[] build(
int kind, Map args, IProgressMonitor monitor)
throws CoreException;
となるが,第1引数のint kindって一体何なのだろうか。
突然だが,Javaプログラムの開発をJDTを用いて行っている場合,プログラミング作業に不可欠なコンパイル作業を明示的に行う必要がない。JDTで提供されるJavaビルダーが自動的にコンパイル作業を行ってくれている。
この際,Javaプロジェクト内のすべてのソースコードに対してコンパイルを行っているかというと,ほとんどの場合そうではない。ソースコードというリソースについて,変更が生じたリソースのみをコンパイルするようにJavaビルダーは動作している。完全にコンパイル作業を開発者に意識させないようにするためには,最低限のリソースに対してビルドを行い,できる限りビルド時間を短縮しなければならない。このように,変更が加えられたリソースに対してのみ次々とビルドを行っていくビルドのことを,インクリメンタルビルドと呼ぶ。新規ビルダーの定義で作成したビルダーのクラスが継承した親クラスの名前「IncrementalProjectBuilder」の由来も理解できるだろう。
もちろん,すべてのリソースに対してビルドを行わなければならないときもある。その場合は,Eclipseの「Rebuild All」or「Rebuild Project」メニューを選ぶことで,例えばJavaビルダーはすべてのソースコードに対してコンパイルを行ってくれる。すべてのリソースに対してビルドを行うことを,完全ビルドと呼ぶ。
上記のビルドの種類は,IncrementalProjectBuilderクラスの定数として定義されている。
・IncrementalProjectBuilder.INCREMENTAL_BUILD - インクリメンタルビルド
・IncrementalProjectBuilder.FULL_BUILD - 完全ビルド
・IncrementalProjectBuilder.AUTO_BUILD - 自動ビルド
AUTO_BUILDに関しては,内容を変更したリソースに対して保存を行ったときなどに,Eclipseが自動的にビルドを実行したことを表す定数である。
さて,冒頭で紹介したbuildメソッドの第1引数には,上記の定数のうちのいづれかの値がEclipseによって渡される。kindにFULL_BUILD値が渡されたときには,全リソースに対してビルド作業を行い,それ以外の場合はリソース変更デルタ(どのリソースが変更されたのか,という情報を持つ。そのうち解説する予定)を見て,インクリメンタルビルドを行うか完全ビルドを行うかを判断する。kind引数によるビルド処理の分岐の例を以下に示す(これは「Platform プラグイン・デベロッパー・ガイド」に記載されているコードである)。
protected IProject[] build(
int kind, Map args, IProgressMonitor monitor)
throws CoreException {
if (kind == FULL_BUILD) {
// 完全ビルド
} else {
IResourceDelta delta = getDelta(getProject());
if (delta != null) {
// インクリメンタルビルド
} else {
// 完全ビルド
}
}
}
リソース変更デルタオブジェクトは,getDeltaメソッドを呼び出すことで取得できる。これがnullの場合は,リソースの変更が行われていないと判断し,完全ビルドを行っている。もしリソース変更デルタオブジェクトがnullではない場合は,それが持つ情報を元にインクリメンタルビルドを行っている。もちろんkind引数がFULL_BUILDだった場合は,完全ビルドを行っている。
このbuildメソッド内の処理如何によって,Eclipseの使用感に雲泥の差がでてくるので,プラグイン開発者の腕の見せ所であると言えるだろう。
| 固定リンク
この記事へのコメントは終了しました。
コメント