カスタムビルド

build.properties内の値を上書きして、Propelのビルドプロセスをカスタマイズすることが可能です。柔軟性を最大にするため、Phingのbuild.xmlファイル自信を自前で用意することもできます。

build.propertiesのカスタマイズ

Propelビルドをカスタマイズする一番簡単な方法はプロジェクト内のbuild.propertiesファイルのビルド属性を指定することです。

Phingのビルド属性を理解する

属性(Properties)は一番重要な変数です。これらの変数はコマンドラインか、属性ファイル内で指定されます。

例えば、以下が属性をコマンドラインから指定する方法です:

$> phing -Dpropertyname=value

一般的には属性はPhingがロードするファイルの中にあります。Javaの属性ファイルをみたことの無い人にとってはこれらのファイルはPHP INIファイルのように見えるでしょう。主な違いは属性ファイルの中の値は他の属性への参照であることです(この昨日はPHP 5.1のINIファイルにはあるはずです)。

重要:一度ロードされた属性は明示的に同じ名前でしてされない限り上書きされることはありません。Propelのビルドプロセスでは属性の値の優先順位は以下のようになります:

  1. コマンドライン属性
  2. プロジェクト build.properties
  3. トップレベル build.properties
  4. トップレベル default.properties

例えばプロジェクト内のbuild.propertiesで指定された値はトップレベルのbuild.propertiesdefault.propertiesファイルにある値を上書きするということです。

値の変化

build.propertiesdefault.propertiesをみることで、Propelで変更できる値を知ることができます。

しかしいくつかの値は昔のアプリからのもので、Propel 1.1で消される予定になっています。

新しいビルドアウトプットディレクトリ

ここはプロジェクト毎に簡単にカスタマイズできます。例えばここにあるbookstoreプロジェクト用のbuild.propertiesは生成したクラスを /var/www/bookstore/classesにそして、生成されたSQLファイルを/var/www/bookstore/db/sqlに保存するように指定しています:

propel.project = bookstore
propel.database = sqlite
propel.database.url = sqlite://localhost/./test/bookstore.db
propel.targetPackage = bookstore

# ディレクトリ
prope.output.dir = /var/www/bookstore
propel.php.dir = ${propel.output.dir}/classes
propel.phpconf.dir = ${propel.output.dir}/conf
propel.sql.dir = ${propel.output.dir}/db/sql

targetPackage属性は生成されたクラスファイルの為のパスにも使われます。この上の例ではBook.phpクラスは/var/www/bookstore/classes/bookstore/Book.php内にあります。そしてtargetPackcage属性を変えることで、bookstoreサブディレクトリを変えることができます。

propel.targetPackage = propelom

そしてクラスファイルは/var/www/bookstore/classes/propelom/Book.phpにあります。

targetPackage属性をschema.xml内の<database>タグや<table>タグの中でpackage""属性を指定することで上書きすることができることに注意してください。

build.xmlを自前で作る

ビルドスクリプトの動作に大きな変更が必要な場合は、自前でPhingビルドスクリプトを用意することも可能です。これをすることはそんなに恐ろしいことではなく、一度Phingビルドファイルを作ってみるとプロジェクトの他のところに対してもビルドターゲットを作ってみたくなるはずです(Phing 2.1-CVSでサポートされているバッチユニットテストの実行など)。

始めるにあたり、build-propel.xmlスクリプトを見てみることをお勧めしますbuild-propel.xml(このbuild.xmlスクリプトはただのラッパースクリプトです)。

Phing動作の詳細を知る前に、重要なことはPhingビルドスクリプトXMLはターゲットでグループになり関数の用になっているというこことです。スクリプトの実際の動作はタスクによって実行され、これはベースPhingタスククラスを継承し、抽象関数を実装するPHP5クラスです。Propelにはオブジェクトモデルを作るテンプレートを作成するいくつかのPhingタスクが用意されています。

ステップ 1: 必要なタスクの登録

Propelタスクを登録して、Phingが見つけれるようにします。これには<taskdef>タグを使います。これはbuild-propel.xmlファイルの上の方にあります。

例えばこれがオブジェクトモデルに対するPHPクラスを作るpropel-omタスクを登録する方法です:

<taskdef
    name="propel-om"
    classname="propel.phing.PropelOMTask"/>

簡単でしょう? Phingはここで<propel-data-model>タグをPropelOMTaskクラスとつなげ、(include_path内にある)propel/phing/PropelOMTask.php にあることを期待します。Propel generatorクラスがinclude_pathに無い場合は、そのパスを<taskdef>タグで指定することもできます:

<taskdef
    name="propel-om"
    classname="propel.phing.PropelOMTask"
    classpath="/path/to/propel-generator/classes"/>

または、再使用性を最大にするために、<path>オブジェクトを作りそれを参照することもできます(これがbuild-propel.xmlのやり方です)。

  <path id="propelclasses">
      <pathelement dir="/path/to/propel-generator/classes"/>
  </path>
  
  <taskdef
    name="propel-om"
    classname="propel.phing.PropelOMTask"
    classpathRef="propelclasses"/>

ステップ 2: 新しいタスクの実行

これで<propel-om>タスクがPhingに登録されたので、ビルドファイル実行できるようになりました。

<propel-om
      outputDirectory="/var/www/bookstore/classes"
      targetDatabase="mysql"
      targetPackage="bookstore"
      templatePath="/path/to/propel-generator/templates"
      targetPlatform="php5">
    <schemafileset dir="/var/www/bookstore/db/model" includes="*schema.xml"/>
</propel-om>

この上の例では<propel-om>タスクが複数のschema.xmlファイルを変換できることになりました。という理由で<schemafileset>サブ要素が存在します。PhingfilesetsはこのHOWTOで扱う範囲を超えていますが、上の例から分かると思います。

ステップ 3: build.xmlに全てをひっくるめる

これでカスタムビルドファイルの重要な要素を一通り見てもらえたと思いますので、これらを動くようにまとめてましょう:

<?xml version="1.0">
<project name="propel" default="om">
 
 <!-- set properties we use later -->
 <property name="propelgen.home" value="/path/to/propel-generator"/>
 <property name="out.dir" value="/var/www/bookstore"/>

 <!-- register task -->
  <path id="propelclasses">
      <pathelement dir="${propelgen.home}/classes"/>
  </path>
  
  <taskdef
    name="propel-om"
    classname="propel.phing.PropelOMTask"
    classpathRef="propelclasses"/>

 
 <!-- this [default] target performs the work -->
 <target name="om" description="build propel om">
  <propel-om
    outputDirectory="${out.dir}/classes"
    targetDatabase="mysql"
    targetPackage="bookstore"
    templatePath="${propelgen.home}/templates"
    targetPlatform="php5">
      <schemafileset dir="${out.dir}/db/model" includes="*schema.xml"/>
  </propel-om>
 </target>

</project>

このビルドスクリプトの名前がbuild.xmlになっている場合、そのファイルのあるディレクトリ内でphingを走らせるだけで実行されます:

$> phing om

実際はomターゲットはデフォルトの為指定する必要はありません。

build-propel.xmlファイルを参照して、他のPropel Phingタスクの例を参照してみてください。例えば<propel-sql>でDDL SQLを生成したり、<propel-sql-exec>でSQLを挿入しているところなどなど。