Windows+Eclipseで(ゴテゴテした)快適なCake開発環境を作る(CakePHP Advent Calendar 2011 11日目)

@mon_satさんからバトンを受け取ってのAdvent Calendar2011 11日目担当EG(@EGMC)です。
初参加で地味ネタですが、開発環境の話ってあまり聞かないのでとりあえず自分なりに育てた開発環境の話をしてみます。

※注 この前置きは長いのでさっさと本題に入りたい方は「開発環境構築編(ここから本編)」へどうぞ

ネタはWindows+EclipsePDT+その他tools。
昨今、勉強会に行くと皆MacBook Airなどを片手に、華麗にターミナルを開いてVimやEmacsで優雅にコーディングしている光景を目に致します。
そんな光景を横目に見つつ、しかしThinkpadでWindowsを起動してEclipseでもっさり開発している人たちも一定数いるはずだ!と信じてこのエントリーを書く次第です。いるかなあ。いるといいなあ。
前提として環境は

・開発サーバー(物理でもVPSでも)を外部(VMとかではなく)立てていて、DBは同サーバー(または同一ネットワーク内)にある
・ローカル環境はWindows+EclipsePDTで構築しており、プロジェクトは作成済み
・ソース編集はローカルで行うが、DBの操作やデバッグ(ログのtailとか)はリモートで行う
・ローカルのWindows環境にもphpがインストールされてる(bake用)

とします。
それ以前の情報は検索すればすぐ当たると思うので他に譲ります。
なお、cake1.3系で書きますが2.0系でも基本的に同じような事が出来ます。
環境設定上examle.netとかにしている部分は適宜ご自分の環境に置き換えてくださいませ。

なぜWindowsなのか?

・プラットフォームに依存したエディタとか、使い慣れたツールがたくさんあるからです。例えば私はHTMLエディタにCrecsent EVEを使ってます。

なぜEclipseなのか?

・元々自分がJava開発をメインでやってたのでその流れて使い始め、慣れていたというのが大きい
・起動の重さとかは色々あるものの、強力な補完機能(コード、Docコメント)、コードへのジャンプ、バージョン管理連携、プラグイン拡張など現実的な機能が多い
・最悪外部エディタが起動出来たり結構なんとかなる
・他の環境(Andoroid開発環境とか)と同居出来る
・起動の遅さについてはRAMDISKなどを使ってある程度は改善出来る

なぜ外にサーバーを立てるのか?

・自分の場合、会社と家で使うPCが違ったりするのでローカルに環境作ると何かと面倒くさい
・外部から叩かれる(例えばFacebookのプラグイン入れたりとか)ような機能を追加したりする
・他の人と環境を共有したりする
・↑みたいなことが無ければ全然VMでいいかなーと思ってます

使うツール群

Eclipse PDT(IDE)
WinSCP(ファイル転送)
PortFowarder(ポート転送)

開発環境構築編(ここから本編)

1)ファイルの自動転送

今回の構成では開発環境はリモートにあるのですが、ソースの反映は書き換えたらリアルタイムで行いたいですよね。
というわけで変更を即座に反映するよう自動転送します。
WinSCPの同期機能を使います。

ローカルはEclipseのプロジェクトフォルダを指定してパスを合わせます。
これで監視下のフォルダで変更があると即座にリモートへ転送してくれます。
無視したいファイル(.svnなど)はこんな感じで除外リストに入れておきましょう。

この状態でセッション保存しておけば、起動→接続→CTRL+Uですぐ同期をスタート出来ます。

2)Eclipseの自動補完を効かせる

なぜEclipseなのか?の所で補完機能を使いたいからだよ!と書きましたが、フレームワーク故にというかCakeはあまりモデルそのものをnewしたりしないので、そのままではほとんど補完が効きません(モデル、コンポーネント、etc・・)。
というわけで補完を効かせるようにコードをいじります。
正直、IDEの補完機能のために不要なコードを足すのはどうなの?という思いもありますが開発効率や動作速度を天秤にかけてこの方法を採用しています。

app_controller.phpに

/**
* Userモデル
*
* @var User
*/
var $User;

/**
* セッションコンポーネント
*
* @var SessionComponent
*/
var $Session;

/**
* authコンポーネント
*
* @var AuthComponent
*/
var $Auth;

/**
* セキュリティコンポーネント
*
* @var AuthComponent
*/
var $Security;

のように書いてどのクラスかを教えてあげます。

これで補完が効くようになります。

3)ローカルからbakeを使う

cakeといえばbakeですよね。
モデルやコントローラの生成が楽に行えますが、リモートで生成したファイルをいちいち持ってくるのは面倒です。
ローカルで(かつIDE内で)作ります。

bakeは当然phpが必要なのでローカルのWindowsマシンにphpを入れます。
bake.batはphpにパスが通ってる前提なのでパスを通します。

さて、これでbakeは実行出来るのですが、モデルの情報を取得するのにDBに接続しなければなりません。
ローカルにDB作るという方法もありますが、いちいち二重化させるのは面倒なのでリモートのDBに繋ぎたいです。
ポート転送を使いましょう。
Teratermのポート転送機能などもありますが、今回はPortForwarderを使います。

config.txtはこんな感じで

Host dev.example.net
HostName dev.example.net
# hostname or IP address

User hoge
# username on server. NEEDED

LocalForward 13306 localhost:3306
# localforward info1

Compression yes
# if you need compression

IdentityFile dev.example.net-key.rsa

13306ポートをリモートサーバーの3306に転送してます。
これでPortForwarderを立ち上げてDBの接続先を13306にすれば繋がります。
開発環境と、ローカルで接続情報が異なる場合は実行パスの判定などを行って接続先を切り替えます。

core.phpで切り替える場合は例えばこんな感じで

if (__FILE__ === 'C:\path_to_workspace\project\app\core.php') {
// ローカルでbakeするための設定
    define( '_DB_HOST' , '127.0.0.1:13306' );
    define( '_DB_NAME' , 'projectname' );
    define( '_DB_USER' , 'user' );
    define( '_DB_PASS' , 'pass' );
} else {
    // サーバーで動かすための設定
    define( '_DB_HOST' , '127.0.0.1:3306' );
    define( '_DB_NAME' , 'projectname' );
    define( '_DB_USER' , 'user' );
    define( '_DB_PASS' , 'pass' );
}

※ちなみにCake2.x系の場合はPORTは別指定になりますね

bake用の実行構成を実行→外部ツールから作成します。

これでIDEからbakeが実行出来ます。

ファイルの生成を行った後、F5でファイルのリフレッシュを行うと反映されますね。

ここまでやると晴れて快適に補完も効き、bakeも使え、ソースも同期される開発環境が構築出来ます。

ちなみにここまでの設定をすべて行って必要な諸々を起動すると画面はこんな感じになります。

・・・・まあ非常にWindowsらしい感じですね、うんうん。
立ち上げているものも多く、そもそもサーバー側で作業すれば楽なことも多々ありますが、まあこれはこれで慣れればいいものですよー。
Windowsで開発をされている方のお役に立てれば幸いです。
あと、こんな面倒なことしなくてもこんなんありまっせ!みたいな情報もあれば是非twitterなどで突っ込んで頂ければと思います。

そんなこんなで初参加のCakePHP Advent Calendar 2011でした。明日は@slumbers99さんです!


Tags: ,

2 Responses to “Windows+Eclipseで(ゴテゴテした)快適なCake開発環境を作る(CakePHP Advent Calendar 2011 11日目)”

  1. […] そんな方には、@EGMCさんのAdvent Calendar 11日目の記事を参考にしてください。 […]

  2. […] 11日目「Windows+Eclipseで(ゴテゴテした)快適なCake開発環境を作る」 http://dasalog.eg2mix.com/advent-201111/ […]