MBS の projectTypeId をプラグイン開発者の都合で変えたい
正解:ProjectConverterを使う.
例によって,情報が殆どないが,他の部分に比べれば割とマシ.なんとなく想像で乗り越えられる.
<extension point="org.eclipse.cdt.managedbuilder.core.projectConverter"> <converter class="jp.pizzafactory.toppers.kernels.jsp.blackfin.converter.Converter" fromId="pizza.toppers.jsp.gnu.blackfin.bf533.exe" id="jp.pizzafactory.toppers.kernels.jsp.blackfin.bf533.converter1" mbsVersion="3.0.0" name="Convert to PF3.1.2 project" toId="cdt.managedbuild.target.gnu.bfin.elf.exe"/> </extension>
などとしておき,
package jp.pizzafactory.toppers.kernels.jsp.blackfin.converter; import org.eclipse.cdt.managedbuilder.core.IBuildObject; import org.eclipse.cdt.managedbuilder.core.IConvertManagedBuildObject; import org.eclipse.cdt.managedbuilder.core.IProjectType; import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; import org.eclipse.cdt.managedbuilder.internal.core.ManagedProject; public class Converter implements IConvertManagedBuildObject { private static final String TO_ID = "cdt.managedbuild.target.gnu.bfin.elf.exe"; //$NON-NLS-1$ public IBuildObject convert(IBuildObject buildObj, String fromId, String toId, boolean isConfirmed) { ManagedProject project = (ManagedProject)buildObj; IProjectType projectType = ManagedBuildManager.getProjectType(TO_ID); project.setProjectType(projectType); return project; } }
などとする.本質的でないところでのハマり箇所があるとすれば,plugin.xmlエディタからjavaクラス生成するときに,IConvertManagedBuildObjectが自動的に入らないことくらい? これはスキーマの記述の甘さが原因.この手の抜けと言うか不親切さというか…は,CDTの他の部分でも散見される.困ったもんだ.…バグレポート書けって? (汗
この例では,projectTypeId だけが入れ替わっているので,とてもシンプル.
コマゴマと変えてしまった場合には,IProjectType辺りから手繰って行って,コマゴマと更新する必要がある.
コンテキストメニューに「convertTo」なんていう項目があるので,ユーザに手動を強いるのかと思うかもしれないけれど,
<projectType id="pizza.toppers.jsp.gnu.blackfin.bf533.exe" isAbstract="false" isTest="false" convertToId="cdt.managedbuild.target.gnu.bfin.elf.exe" name="%projectType.name.blackfin.bf533"> </projectType>
などとしておくと,水面下で動的に変換してくれる.ここの肝はconvertToIdアトリビュート.
完全にリダイレクトしてくれるので,projectTypeエレメントに含まれるconfigurationその他のエレメントはざっくり消去しても構わない.
ここまでケアすると,殆どのユーザは,きっと気づかない.
プロパティを細かく設定する少数ユーザの,ごく一部が「あれ?」と思うくらいだろう.
これをサボると
プロジェクト非互換問題を引き起こす.
CDT系のソフトウェアをアップデートした後でプロジェクトが壊れていると言われる場合,原因は,十中八九,これ.
某社製品も3.0から3.1へのアップデートでごにょごにょ