アップグレードセーフ
出典: SugarForum.jp
アップグレードセーフとは、ソフトウェアのアップグレードを実施した際に、旧バージョンで加えたカスタマイズが、新バージョンでも安全に残る機構のこと。通常のパッケージソフトでは設定ファイルだけ引き継げば良いが、Sugarのようにカスタマイズが前提になる場合は、事情が少々複雑。Sugar本体、カスタマイズしたロジック、設定ファイルのいずれもPHPで書かれるため、その切り分けも意識する必要がある。
目次 |
はじめに
Sugarはオープンソースであるために、使用者が好きにカスタマイズ出来る点は、利点であり欠点だった。利点はもちろん自由度の高さだが、一か所でもカスタマイズするとバージョンアップを自由に適用できなくなると言うジレンマを抱えていた。たとえば、標準モジュールのContactsに、カラムを追加して使っていたとする。もし、「アップグレードセーフ」でない方法でカスタマイズしていると、新しいバージョンにアップグレードすると、せっかく加えた変更も全て上書きされてしまう。
Sugarはバージョン重ねる中で、このジレンマを克服しつつあり、バージョン5で、そのスタイルは確立されたと言っても良いと思う。以下、モジュールの「アップグレードセーフ」を中心に概略を説明したい。
3つの立場
Sugarでは、モジュールについて最大3段階のカスタマイズを許容する。このことを説明するために、3種類の人間を想定しよう。
- A - モジュール開発者: 独自のモジュール開発 (あるいは、Sugar標準モジュールの開発)
- B - パッケージ開発者: 既存のモジュールを組み合わせ、実際に企業で動作するように動作を細かくカスタマイズする。必要に応じて、ソースコードの改変、モジュール開発も行う。
- C - エンドユーザ: コードの変更は一切せず、ブラウザの画面からのみSugarに接している。詳細ビューの項目の並び方などは、自分でカスタマイズできる。
さて、モジュール開発者が"Invoices"(請求書)モジュールを開発した(とする)。なかなか良くできているので、パッケージ開発者はエンドユーザに対して、"Invoices"モジュールの使用を薦め、自社のパッケージと連携するようにカスタマイズを加えた。エンドユーザは、"Invoices"モジュールを日常的に使用しながら、文言(言語データ)や項目の並びなどについては、個人的にカスタマイズして使っている。
まとめてみると、
- A - モジュール開発者: 'Invoices'を開発
- B - パッケージ開発者: 'Invoices'をソースコードレベルで拡張(カスタマイズ)
- C - エンドユーザ: 'Invoices'をSugar Studioでカスタマイズ
といった段階があるわけだ。ここで「アップグレードセーフ」という視点がないと、それぞれが改良を進めていった先には、収拾のつかない事態が待っている。
例えば、モジュール開発者が'Invoices'のバグフィックスを出したとき、エンドユーザは当然、最新版に更新したいと思う。しかし、パッケージ開発者が不用意にソースコードを改変していると、勝手にパッチを当てるわけにもいかない。パッチを当てると改変部分が上書きされてしまうからだ。
実現の方法
3者が幸せになるためには、モジュール開発者のコードと、パッケージ開発者のコードを完全に分けなくてはならない。そして、Sugarはその方法を用意してくれている。後述の、カスタムロジックやカスタムフィールドを使用すれば、(全てではないが)、'Invoices'モジュールの内部に変更を加えることなく、追加機能やビューの拡張が可能だ。
また、モジュール開発者とパッケージ開発者がSugar Studioの利用を念頭に置いていれば、エンドユーザの加えたカスタマイズも、後のバージョンに保存されるだろう。
それぞれの作業ディレクトリ
それぞれの立場で、Sugarをカスタマイズすべき部分は以下のようになる。若干の例外はあるがほぼこの通り。AよりB、BよりCの設定が優先される。
- A - モジュール開発者: modules/Invoices
- B - パッケージ開発者: custom/Extension/modules/Invoices
- C - エンドユーザ: custom/modules/Invoices
('Invoices'の部分は、実際のモジュール名に置き換えて考えて欲しい)
どの機能がアップグレードセーフか
Sugar 5.2 を対象に、アップグレードセーフ機構がどの機能に提供されているかまとめる。
- モジュールのメタファイル (レイアウト定義など)
- モジュールのVardefsファイル (スキーマ定義)
- モジュールのメニュー
- ビジネスロジックフック (保存時などに処理を追加)
- アプリケーションレベルの言語ファイル ($app_strings, $app_list_strings)
- MVCのカスタムビュー
- テーマファイルの一部 (会社ロゴ)
- チャートダッシュレット
(※他にもあるかもしれません。補足願います)
メタデータなどのように、PHPの配列の形で書かれた設定ファイルはアップグレードセーフであることが多い。ただし、下記はその対象外。
- モジュールの検索条件定義 ($searchFields)
今後実装される予定の機能
今後のバージョン(Sugar 5.5)では、下記にもアップグレードセーフ機構が提供される模様。
- SOAP、REST
- テーマファイル