- 2010年12月6日 1:00 PM
- CakePHP

これはCakePHP Advent Calendar 2010の6日目の記事です。
CakePHP Advent Calendarって何?という方はこちらへ。
CakePHPに関するtipsを1日1つ、順番に紹介するということなので、私はGitとCakePHPの活用について書きます。
恐らく、これはCakePHPに限らずあらゆるフレームワークで有効なtipsです。
CakePHPを初めとするフレームワークを長く使っていると、色々と面倒なことが起きてきます。
- フレームワークのバージョンアップ
- 外部ライブラリのバージョンアップ
- 複数プロジェクトにおけるコードの共通化
“フレームワークのバージョンアップ“は重要です。
先日、こんなバグも発見されましたしね。
こういったバージョンアップには素早く対処したいもの。
“複数プロジェクトにおけるコードの共通化“も重要です。
例えば、プロジェクトPancake向けに、MobileComponentを作ったとしましょう。
その後に立ち上がったプロジェクトFruitcakeでもモバイル対応が必要だとします。
そこで簡単に思いつくのは、MobileComponentのファイルを丸ごとコピーすることです。
しかし、この方法には問題があることにすぐに気づきます。
MobileComponentでバグがあった場合はどうするか?
プロジェクトPancakeのMobileComponentを修正すれば良いでしょう。
しかし、プロジェクトFruitcakeはどうするか?
コピーし直す?
そんなの面倒です。
しかも、独自の修正がプロジェクトFruitcakeに加えられているかもしれない。
単純にコピーしただけではプロジェクトFruitcakeが動かなくなるかも…。
コンポーネントにバグがあると、突然こんな恐怖に苛まれます。
今日は、これらの手間を省いたり、ソースコードを保証するためにバージョン管理システムGitを使います。
CakePHPのコアコードをGitで管理する
手始めにCakePHPのコアコードをGitで管理しましょう。
CakePHPはGithubで管理されています。
つまり、Gitを使ってソースコードをダウンロードできます。
やり方は簡単です。
Gitがインストールされたサーバで以下のコマンドを実行するだけです。
git clone https://github.com/cakephp/cakephp.git
私はCakePHPのコアコードを共通で使いたいので、/usr/lib以下のcakephp1.3というディレクトリを作って配置します。
つまり、こんなコマンドを打ちます。
cd /usr/lib sudo git clone https://github.com/cakephp/cakephp.git cakephp1.3
次にやるのは、CakePHPを自分の使いたいバージョンに合わせることです。
CakePHPリポジトリでは、バージョンをブランチとタグで管理しています。
現状では、こんなブランチとタグが存在します。
- ブランチ
- 1.2
- 1.3
- 1.3-postgresql
- 2.0
- 2.0-config
- 2.0-controller
- 2.0-pdo
- 2.0-spl
- 2.0-upgrade
- gh-pages
- master
- タグ
- 1.3-dev
- 1.3.6
- 1.3.5
- 1.3.4
- 1.3.3
- 1.3.2
- 1.3.1
- 1.3.0-beta
- 1.3.0-alpha
- 1.3.0-RC4
- 1.3.0-RC3
- 1.3.0-RC2
- 1.3.0-RC1
- 1.3.0
- 1.2.9
- 1.2.8
- 1.2.7
- 1.2.6
- 1.2.5
- 1.2.4
- 1.2.3
- 1.2.2
- 1.2.1
- 1.2.0
ブランチでは、各バージョンの最新のソースコードを管理しています。
タグでは、公式に公開した各マイナーバージョンのソースコードを管理しています。
タグとブランチは、開発する上でその運用が異なります。
しかし、Gitにとってはこれらに違いはありません。
(詳しく知りたい方はオライリーの実用Gitがオススメです。)
git cloneで出来たディレクトリに移動し、以下のコマンドを実行することで、自分の好きなソースコードを手に入れることが出来ます。
ブランチの場合は、以下のコマンドを実行します。
sudo git checkout -t origin/[ブランチ名]
タグの場合は、以下のコマンドを実行します。
sudo git checkout -b [タグ名]
私は先ほどgit cloneで作成したディレクトリで、CakePHP1.3.xの最新版を管理しています。
sudo git checkout -b 1.3.6
このようにディレクトリをGitで管理しておけば、バージョンアップも簡単です。
最新版がリリースされたら、次のコマンドを実行します。
cd /usr/lib/cakephp1.3 sudo git fetch sudo git tag sudo git checkout -b [最新のバージョンナンバー]
これで楽にCakePHPのコアコードのバージョン管理が出来ますね!
ちなみに、この方法で管理しておけば、”コアコードリーディングの途中に、うっかりコードを編集してしまった!“ということも防げますよ。
(git statusを実行すると、どのコードが編集されたかわかります。git checkout — [ファイル名]で編集前の状態に戻せます。)
外部ライブラリをGitで管理する
うまくCakePHPをGitで管理出来ましたか?
次は外部ライブラリをGitで管理してみます。
“自身のプロジェクトのソースコードがGitで管理されていること“を前提とします。
さて、何のライブラリを入れましょうか。
定番のdebug_kitを入れましょう。
自分のプロジェクトのディレクトリに移動した後に、以下のコマンドを打ちます。
git submodule add https://github.com/cakephp/debug_kit.git plugins/debug_kit git add plugins/debug_kit .gitmodules git commit -m 'Add debug_kit plugin.'
これで、plugins/debug_kitにdebug_kitプラグインのソースコードがダウンロードされます。
.gitmodulesという不思議なファイルが出来たので中身を確認してみます。
[submodule "plugins/debug_kit"] path = plugins/debug_kit url = https://github.com/cakephp/debug_kit.git
意味は簡単に分かるでしょう。
- plugins/debug_kitをサブモジュールとして管理しますよ。
- そのモジュールはhttps://github.com/cakephp/debug_kit.gitで管理しますよ。
ということです。
次はこのプロジェクトをgit cloneします。
(プロジェクトのリポジトリは/home/tfmagician/advent_calendarにあるとします。)
git clone file:///home/tfmagician/advent_calendar ~/advent_calendar_clone cd ~/advent_calendar_clone ls plugins/debug_kit
git cloneは出来たのですが、plugins/debug_kitの中身は空です。
そこで以下のコマンドを打ちます。
cd ~/advent_calendar_clone git submodule init git submodule update ls plugins/debug_kit
これでplugins/debug_kitにソースコードがダウンロードされました。
この状態では、debug_kitは名無しのブランチとなっています。
そこで、debug_kitを自分の使いたいブランチに切り替えます。
cd ~/advent_calendar_clone/plugins/debug_kit git checkout -b 1.3.0 git branch
これで外部ライブラリのバージョンを、自身のプロジェクトと別に管理できます。
git submodule addしたライブラリは、単純なGitのリポジトリです。
バージョンアップがあった場合は、git fetchやgit pullで最新の状態に更新できます。
しかし、少し注意点が。
git submoduleは便利なのですが、git cloneをするときに少し手間です。
先ほど示した通り、サブモジュールのブランチは手動で切り替える必要があります。
実際に使う場合は、git submodule initやupdate、ブランチの切り替えなどをひとまとめにしたセットアップスクリプトを用意しておくと良いかもしれませんね。
より詳しくgit submoduleについて知りたい場合は、以下のページが参考になります。
CakePHPでは、ソースコードを以下のように管理するよう規約で決まっています。
(不要な部分は省いています。)
models/ # アプリケーションで使用するモデル + behaviors/ # モデルの処理を共通化するビヘイビア views/ # アプリケーションで使用するビュー + helpers/ # ビューの処理を共通化するヘルパー controllers/ # アプリケーションで使用するコントローラ + components/ # コントローラの処理を共通化するコンポーネント plugins/ # CakePHPのプラグイン vendors/ # 外部ライブラリ
このうち、git submoduleで管理するのはpluginsディレクトリとvendorsディレクトリでしょう。
behaviorsやcomponents、helpersもgit submoduleで管理したくなるのですが、そのあたりの住み分けは次で説明します。
自分のコードをGitで管理する
最後は、自分のコードをGitで管理しましょう。
自分のコードといっても、単純にGitを使うだけではありません。
git submoduleを使った複数プロジェクトでのコード管理です。
git submoduleの使い方は、先ほど説明したので省略します。
CakePHPにおいて、どのようにgit submoduleを活用するかに焦点をおきます。
models/ # アプリケーションで使用するモデル + behaviors/ # モデルの処理を共通化するビヘイビア views/ # アプリケーションで使用するビュー + helpers/ # ビューの処理を共通化するヘルパー controllers/ # アプリケーションで使用するコントローラ + components/ # コントローラの処理を共通化するコンポーネント plugins/ # CakePHPのプラグイン vendors/ # 外部ライブラリ
CakePHPではこのような構成を取ります。
プロジェクトを立ち上げた後、共通処理がbehaviorsとcomponents、そしてhelpersにまとまります。
コードを書いていると、ふと気づきます。
このコードは他のプロジェクトで再利用出来るんじゃないか?
そのことに気づいた時点で、そのコードは別に管理したくなるはずです。
幸いにもCakePHPにはプラグインという仕組みがあります。
CakePHPのプラグインでは、pluginsディレクトリの中に通常のCakePHPアプリケーションと同じ構成のアプリケーションを配置できます。
配置したアプリケーションは、親のアプリケーションから自由にインポート出来ます。
つまり、再利用したいと考えたコードはプラグインとしてまとめて、git submoduleで管理すれば良いんです。
例として、ビヘイビアに焦点を当てて考えてみましょう。
以下の構成で、RicepanBakerBehavior(ricepan_baker.php)を複数プロジェクトで共通化したいとします。
models/
+ behaviors/
ricepan_baker.php
something.php
tests/
+ cases/
+ models/
+ behaviors/
ricepan_baker.test.php
something.test.php
+ fixtures/
bakery_fixture.php
something_fixture.php
plugins/
これをこのように変更します。
models/
+ behaviors/
something.php
tests/
+ cases/
+ models/
+ behaviors/
something.test.php
+ fixtures/
something_fixture.php
plugins/
+ ricepan/
+ models/
+ behaviors/
ricepan_baker.php
+ tests/
+ cases/
+ models/
+ behaviors/
ricepan_baker.test.php
+ fixtures/
bakery_fixture.php
これで、ソースコードやテストケースを完全に分離できました。
あとはplugins/ricepanをGitリポジトリとして分離し、どこかにホストすればOKです。
その後は、先ほど紹介したgit submoduleを使って管理ですね。
ホストする場所はどこでも良いのですが、せっかくなのでGithubなどの公開リポジトリに置けないかを考えてみましょう。
ソースコードを公開すれば、それだけ共通の資産が増えますからね。
他の人のアドバイスも貰えるかもしれない。
自分の成長の手助けにもなるでしょう。
いかがでしょうか。
初心者向け…で書いたつもりが、GitやCakePHPの前提知識がかなり必要な内容となってしまいました。
しかし、Gitは使いこなすと本当に便利です。
フレームワークとも相性はバッチリです。
どんどん活用していきましょう!
明日は@ecworks_masapさんです。
CakePHP辞典の著者としてものすごいtipsを書いてくれるでしょう!
期待してます!
|
CakePHP辞典
|
こちらもあわせてどうぞ
- CakePHP 1.2.8 released
- CakePHP 1.3.4 リリース
- CakePHPプラグインのまとめ – ヘルパー編
- CakePHPでメールの送信を簡単にするEmailPlugin
- CakePHPプラグインのまとめ – 最適化/デバッグ編
ちょっと一言
先日、紹介したGitoriousをインストールしたんですが、結構時間が掛かりました。
ただ、かなり詳細なインストール手順が公開されているので、間違いなくセットアップ出来ますよ。
まだ、Gitoriousを使ったことがないという人は一度インストールしてみては?
-
http://net.nomiti.com/bookmark/?p=2714 » Gitと一緒にCakePHPを楽しむ – CakePHP Advent Calendar 2010 6日目 My_Room-bookmarks
-
http://nob-log.info/2011/02/14/git%E3%82%92%E3%83%95%E3%83%AB%E6%B4%BB%E7%94%A8%E3%81%97%E3%81%9F%E9%96%8B%E7%99%BA%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%E3%82%92%E6%A8%A1%E7%B4%A2%E3%81%99%E3%82%8B%E3% Gitをフル活用した開発スタイルを模索するメモ | のぶろぐ


