ビルドをカスタマイズする
propel のbuild.properties ファイルで値をオーバーライドすることでPropelのビルドプロセスをカスタマイズすることは可能です。最大の柔軟性のために、独自のPhing のbuild.xmlファイルを作成するさえ出来ます。
build.propertiesをカスタマイズする
Propelのビルドをカスタマイズするもっとも簡単な方法はプロジェクトのbuild.propertiesファイルでビルドプロパティを指定するだけです。
Phingビルドプロパティを理解する
プロパティは必用不可欠な変数です。これらの変数はコマンドライン上もしくはプロパティファイルで指定することが出来ます。
例えば、コマンドライン上でプロパティを指定する方法は次の通りです:
$> phing -Dpropertyname=value
より一般的には、プロパティはファイルに保存されPhingによってロードされます。Javaのプロパティファイルに慣れていない方のために、これらのファイルはPHP INIファイルのようになっています; 主要な違いはプロパティファイルにある値は他のプロパティに参照できることです(INIファイルにおけるこの機能はおそらくPHP 5.1にあります。)
重要: プロパティは、一旦ロードされると、明らかに指示されない限り同じ名前のプロパティでオーバーライドされません、Propelのビルドプロセスにおいて、プロパティの値のための優先順位は次の通りです:
- コマンドラインプロジェクト
- プロジェクトの build.properties
- トップレベルの build.properties
- トップレベルの default.properties
このことが意味することは、例えば、プロジェクトのbuild.properties ファイルで指定された値はトップレベルのbuild.propertiesとdefault.properties ファイルにある値をオーバーライドするということです。
値を変更する
Propelで修正するものを理解するために、build.propertiesとdefault.propertiesファイルにざっと目を通してみましょう。
しかしながら、現在の値の中にはレガシーな理由のために存在し、Propel 1.1ではクリーンアップされることに注意して下さい。
新しくビルド出力ディレクトリをビルドする
これはプロジェクトごとのプロジェクトのベース上で容易にカスタマイズすることが出来ます。例えば、生成されたクラスを/var/www/bookstore/classesに設置し生成されたSQLを/var/www/bookstore/db/sqlに設置するbookstore のためにbuild.propertiesファイルがあります:
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に位置します。targetPackageプロパティを変えることでこのbookstoreサブディレクトリを変更することが出来ます:
propel.targetPackage = propelom
これでクラスは/var/www/bookstore/classes/propelom/Book.phpに設置されます
schema.xmlの<database>タグもしくは<table>タグでpachage=""属性を指定することでtargetPackageプロパティをオーバーライドすることが出来ることに留意して下さい。
カスタムのbuild.xmlファイルを作成する
スクリプトが動作する主な方法を変更をしたい場合、独自のPhingビルドスクリプトをセットアップすることが出来ます。これは実際にはそれほど怖いタスクではなく、一旦なんとかPhingビルドスクリプトを作成することができれば、プロジェクトの他の面のためにビルドターゲットを作成したいでしょう(例えば、バッチユニットテストがPhing 2.1-CVSでサポートされています)。
始めるために、build-propel.xmlスクリプト(build.xmlスクリプトは単なるラッパースクリプトです)をご覧頂くよう提案します。しかしながら、build-propel.xmlスクリプトは多くのものとプロパティの使用を簡単にするために設計された多くの複雑性を持つことに留意して下さい(怖がらないで下さい)。
Phingがどのように動作するのかについてはここでは深入りをしません。重要なことはPhingはXMLスクリプトをビルドしてそれらは関数のようなターゲットに分類されます。スクリプトの実際の動作はPhingのTaskクラスを拡張して抽象メソッドを実装したタスクによって実行されます。Propelはオブジェクトモデルを作成するテンプレートと連携するPhingタスクを提供します。
ステップ 1: 必要なタスクを登録する
PhingがPropelタスクを使えるようにするためにPhingは登録されなければなりません。<taskdef>タグを使用することで行われます。build-propel.xmlファイルのトップ近くでこれを見ることが出来ます。
例えば、オブジェクトモデルのためにPHPクラスを作成するpropel-omタスクを登録する方法を示します:
<taskdef
name="propel-om"
classname="propel.phing.PropelOMTask"/>
これで十分です。Phingは<propel-data-model>を(include_path上の)propel/phing/PropelOMTask.php で見つかるPropelOMTaskクラスと関連付けます。 Propelジェネレータクラスが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>サブ要素があるのはそういうわけです。Phingのfilesetsはこのハウトゥーの範囲を超えますが、上記の例は十分に明白です。
ステップ 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ターゲットはデフォルトなので指定する必要はありません。
どのように他のPropel Phingタスクを使うのかについてはbuild-propel.xmlファイルを参照して下さい -- 例えば<propel-sql>はDDL SQLを生成するためで、<propel-sql-exec>はSQLを追加するため、などです。
