最近お気に入りのPHPライブラリ開発手法
PEAR2/Pyrus ってどうなったんだっけ?
という話はとりあえず一旦置いておいて、最近わりかしカジュアルにPHPライブラリを開発して配布する方法がなんとなく自分の中で定着してきたので超ざっくりまとめておく。
ソースコードはGitHub、開発にはgitflow、配布はOpenpear
Openpear で世界征服の話はどうなったんだ、というのは置いておいて、ざっくり、上記の通り、
というのが一番楽だと思っている。
ソースコードはGitHub
Openpear はとっても便利なサービスで、SVNでのホスティングもサポートしているのだけど、今更SVNを使いたくもないし、Openpear で今後Gitをサポートする予定もない。
GitHubではGitによるfork/pull request のエコシステムが出来上がりつつあると思っていて、開発者もそこにいるし、GitHubでなんか作っておけば人にコード見てもらったり修正してもらったり、それを取り込んだりが非常にやりやすい環境が揃っている。
もうGitHubを使わない手はない。
配布はOpenpear
で、GitHubで開発したものを直接PEARパッケージ化して、PEARコマンドでインストールできるようにしたいわけだ。
だけど、GitHub登場以来何度かForumに登場しているPEARの公式サポートの件はまとまらないまま話が立ち消えたりして、なんともなっていない。
と、ここで登場するのがOpenpearだ。
Openpear は、上記の通りSVNリポジトリのホスティングはしているが、パッケージの設定で、外部のリポジトリ(SVN、Git、Mercurial)が指定できる。
つまり、ここに、ホスティング先のGitHubのリポジトリを指定すれば、それだけでPEARパッケージ化することができるし、以下のコマンドでインストール可能な形式で配布できる。
$ sudo pear install openpera/Git_Daily
ところで、OpenpaerでGitHubからリリースするにはちょっとした設定のコツ?がいるというか、注意すべき点があるので、一応それはここで説明しておく。
- public にアクセス可能なリポジトリURIを指定すること
- master からリリースされるため、master をリリース可能なバージョンとして作るようにリポジトリ運用をすること
- (Openpear 側に、リリース先のブランチを指定する機能がない...ということです)
- target dir に、リポジトリのルートからの相対パスを指定する
- 例えば、 上記の git-daily であれば、
- ルート: https://github.com/sotarok/git-daily/tree/master
- PEARリポジトリに入れたいディレクトリ: https://github.com/sotarok/git-daily/tree/master/src
- 従って、リリース設定は、 target dir を src とする
- 例えば、 上記の git-daily であれば、
- コマンドラインスクリプトをインストールするときはPEAR_PackageProjector2 の conf 形式で拡張設定をしなければいけない(この話はまた今度書くか)
以下参考:
開発ツールとしてgitflow を使う
gitflow は、上記Openpearの制約にぴったりなツールだ。
develop ブランチを開発用ブランチとして普段のやりとりにつかい、releaseブランチを経て、最終的にタグと共に master ブランチに merge される。master ブランチは、常に、安定してきた開発用のブランチからのマージコミットしか存在せず、つまり、master ブランチが、「配布して良いブランチ」となる。
参考:
- A successful Git branching model » nvie.com
- 見えないチカラ: A successful Git branching model を翻訳しました
- A successful Git branching model を補助する git-flow を使ってみた - Twisted Mind
あ、ちなみに、さっきから例に用いている git-daily というのは、gitflow に似たツールなんだけど、ライブラリ開発用というより、もっと頻繁に修正リリースとかが発生するようなウェブアプリ開発用のgit補助ツールであったりする。最近はいつも自分もコレを使ってウェブアプリの開発をしているわけだけど、これはこれで相当便利なのでまた今度話題にします。
一応参考:
具体的な手順
- 手元で、Gitでライブラリ開発を開始する
- git flow init して、develop で開発
- 適当なタイミングでGitHubにリポジトリを作ってpush
- developブランチでなんやかんやしてよしリリースやー、となったら git flow release start, -> … -> git flow release finish
- master にマージされるので、これをGitHubにpush
- Openpear にそのライブラリ用のパッケージを新規作成
- リポジトリ設定で、GitHubのURIを指定する
- リリース処理
- pear コマンドでインストール可能な形で配布完了
という感じです。あとはGitHubで開発継続、gitflowでmasterへマージ、Openpearで配布(リリース)を繰り返せばなんとなくうまくいく感じがしませんか。