To use this "how-to", you need to install phing in your machine.
I want to show you a little example that allows me to configure gii password and database informations, with phing.
First of all, when I start a new yii application, I copy protected/config/main.php in protected/config/main.php.dist and updating some field like:
'db' => array( 'emulatePrepare' => true, 'charset' => 'utf8', 'connectionString' => 'mysql:host=[[hostname]];dbname=[[database]]', 'username' => '[[username]]', 'password' => '[[password]]', ),
Also, I like to set gii configuration in this way:
'gii' => array( 'class' => 'system.gii.GiiModule', 'password' => '[[giipassword]]', 'ipFilters' => array('127.0.0.1', '::1'), ),
My complete config(.dist) file looks like this:
return array( 'basePath' => dirname(__FILE__) . DIRECTORY_SEPARATOR . '..', 'name' => 'YiiApp', 'preload' => array( 'log' ), 'import' => array( 'application.models.*', 'application.components.*', ), 'modules' => array( 'gii' => array( 'class' => 'system.gii.GiiModule', 'password' => '[[giipassword]]', 'ipFilters' => array('127.0.0.1', '::1'), ), ), 'components' => array( 'user' => array( 'allowAutoLogin' => true, ), 'db' => array( 'connectionString' => 'mysql:host=[[hostname]];dbname=[[database]]', 'emulatePrepare' => true, 'username' => '[[username]]', 'password' => '[[password]]', 'charset' => 'utf8', ), 'errorHandler' => array( 'errorAction' => 'site/error', ), 'log' => array( 'class' => 'CLogRouter', 'routes' => array( array( 'class' => 'CFileLogRoute', 'levels' => 'error, warning', ), ), ), ), 'params' => array( 'adminEmail' => 'webmaster@example.com', ), );
Now I can create build.xml and put it inside this content:
<?xml version="1.0" encoding="UTF-8"?> <project name="MyYiiApp" default="database"> <target name="database" description="Configure database"> <input propertyname="hostname" defaultValue="127.0.0.1" promptChar="?">Enter the hostname of db.</input> <input propertyname="database" defaultValue="database" promptChar="?">Enter the name of db.</input> <input propertyname="username" defaultValue="root" promptChar="?">Enter username to access to the db.</input> <input propertyname="password" defaultValue="root" promptChar="?">Enter password to access to the db.</input> <input propertyname="giipassword" defaultValue="giipassword" promptChar="?">Enter password to access to gii.</input> <copy file="protected/config/main.php.dist" tofile="protected/config/main.php" overwrite="true"> <filterchain> <replacetokens begintoken="[[" endtoken="]]"> <token key="hostname" value="${hostname}" /> <token key="database" value="${database}" /> <token key="username" value="${username}" /> <token key="password" value="${password}" /> <token key="giipassword" value="${giipassword}" /> </replacetokens> </filterchain> </copy> </target> </project>
And now, I can run
$ phing
The output will be similar to this:
Buildfile: /var/www/yiiapp/build.xml: Enter the hostname of db. [127.0.0.1]? Enter the name of db. [database]? yiiapp Enter username to access to the db. [root]? Enter password to access to the db. [root]? Enter password to access to gii. [password]? [copy] Copying 1 file to /var/www/yiiapp/protected/config [copy] Copying 1 file to /var/www/yiiapp/protected/config BUILD FINISHED
As you can see, some questions will be asked from you. Your answers will override main.php.dist file options when copying it to main.php.
This is just a simple example of how you can install your application using this method.
You can also, for example, create your own console command and call them with phing.
Total 3 comments
I've never used it before but this seems to be a pretty cool "phing" ;-) Especially if you have an app that's used in many projects and that uses a few customized parameters (app-name, admin-email etc.). Thanks for sharing
My goal was to fast update my config file. Tell me: wich one is better, and why? For me replacetokens is more intuitive.
Hello there,
first of all - nicely done. I'm just curious why you've used the replacetokens filter instead of expandproperties?
Leave a comment
Please login to leave your comment.