Phingの履歴
PHP版ant。情報があんまりないなぁ…。Symfonyで使われてるみたいだけど。
http://phing.info/trac/
ユーザガイド
http://phing.info/docs/guide/current/
インストール
% pear channel-discover pear.phing.info
% pear install phing/phing
サンプル
例)temp,logディレクトリを作成して、777にする
build.xml
<?xml version="1.0"?> <project name="myproject" default="install" basedir="."> <target name="install"> <echo msg="Making directory" /> <mkdir dir="temp" /> <mkdir dir="log" /> <chmod file="temp" mode="0777" /> <chmod file="log" mode="0777" /> </target> </project>
build.xmlがあるディレクトリでコマンドを実行
% phing
タスク
CapsuleTask
テンプレートを使ってファイル生成する。例えば自分でscaffoldみたいなことが作れる。CapsuleというのはPhingが用意した素のPHPによるテンプレートエンジン。テンプレート内で<?php echo $var ?>とかやって変数出力する。素のPHPだからテンプレート内でコードも書けるので手軽。同じようなものにSmartyTaskがある。
指定しなければならないプロパティ
- templatePath
- controlTemplate(テンプレートファイル名)
- outputDirectory
- outputFile
- contextProperties(assignする変数をproperties形式で書かれたファイル名)
Zend_Config, Zend_DBを使ってmigrateするタスク
lib/DbMigrateTask.php
<?php include_once 'phing/Task.php'; class DbMigrateTask extends Task{ protected $connectorFile; /** * @var Zend_Db_Adapter_Abstract */ private $db; /** * @var FileSet */ private $filesets; public function addFileset(FileSet $set) { $this->filesets[] = $set; } function main(){ require_once('Zend/Config/Ini.php'); $config = new Zend_Config_Ini($this->connectorFile); require_once('Zend/Db.php'); $this->db = Zend_Db::factory($config->database); // deal with the filesets foreach($this->filesets as $fs) { $ds = $fs->getDirectoryScanner($this->project); $srcDir = $fs->getDir($this->project); $srcFiles = $ds->getIncludedFiles(); $this->run_sql($srcDir, $srcFiles); } } function run_sql($dir, $files){ foreach ($files as $file){ $path = $dir . DIRECTORY_SEPARATOR . $file; $this->log("load $path"); $sql = trim(file_get_contents($path)); $sqls = split('\s*;\s*', $sql); foreach ($sqls as $s){ $manip = ''; $table_name = ''; if (!$s) continue; if (preg_match('/create table(?: if not exists)? `(\w+)`/i', $s, $match)){ $manip = 'create table'; $table_name = $match[1]; }else if (preg_match('/alter table `(\w+)`/i', $s, $match)){ $manip = 'alter table'; $table_name = $match[1]; } $this->db->query($s); $this->log("$manip $table_name OK"); } } } function setConnectorFile($file){ $this->connectorFile = $file; } } ?>
build.xml
<project name="myproject" default="install" basedir="."> <taskdef name="dbmigrate" classname="mindia.task.DbMigrateTask" classpath="lib" /> <target name="install"> <dbmigrate connectorFile="config/server.ini"> <fileset dir="application/db"> <include name="*.sql" /> </fileset> </dbmigrate> </target> </project>
config/server.ini
[database]
adapter = Pdo_MySQL
params.engine = mysql
params.username = akkun
params.password = password
params.host = localhost
params.dbname = mydatabase
後はapplication/dbディレクトリに実行したいsqlファイルをいれてphing!