OpenPNE開発のSubversion活用法
解説:海老原
文:井本
概要
OpenPNEでは、Subversionというバージョン管理システムを用いてソースコードの管理をおこなっています。
ここでは、OpenPNE開発でSubversionがどのように使われてるか、OpenPNEのTracを見ながら紹介していきます。
OpenPNE開発情報 http://trac.openpne.jp/
まず、上のグローバルメニューから「Browse Source」をクリックすると、Subversionで管理されているファイルの一覧を見ることができます。(http://trac.openpne.jp/browser)[[BR]]
OpenPNE本体のソースコードは、ルートディレクトリ(一番上のディレクトリ)にある「OpenPNE」という名前のディレクトリに格納されています。
(注:ルートディレクトリにはこの以外にも、作業用のディレクトリ(work)やOpenPNEに関わる仕様書やドキュメント類用のディレクトリ(OpenPNE_specification)などがあり、用途に応じて使い分けています)
OpenPNE OpenPNE_specification prj sandbox work
OpenPNE開発用ディレクトリ
「OpenPNE」以下は、Subversionでソースコードが管理されている多くのプロジェクトと同様に、次のような構造になっています。
trunk branches tags
trunkとは「幹」を意味する英単語です。このtrunkディレクトリがOpenPNE開発の本流となります。開発版の機能追加やバグフィックス、成果物のマージ(取り込み)などがおこなわれています。
一方、branchesは「枝」を意味します。「幹」であるtrunkから派生したソースコードが、「枝」であるbranchesに格納されています。安定したバージョンのメンテナンスや、各個人による機能追加やプロジェクトの進行など、OpenPNE開発の本流とは別の用途に使われるディレクトリです。
tagsはある特定の時点のソースコードを残しておくためのものです。
ブランチの構造
branchesディレクトリには、以下のようなブランチがあります。
prj:プロジェクトとしてチームで開発をおこなうブランチ stable-x.x.x:安定版のバグ修正などをおこなうブランチ work:個人での機能開発をおこなうブランチ
stableブランチ
stable-x.x.xは安定版のメンテナンス(バグ修正など)をおこなうためのブランチです。あるバージョンで修正するべきバグなどの対応が一通り完了した場合、このブランチの特定リビジョンをtagsディレクトリにコピーし、リリースされます。
stableブランチは、そのバージョンをメンテナンスするべき期間(次の次のバージョンのベータ版リリースまで)、保守され続けます。
プロジェクト開発用ブランチ
prjブランチは、プロジェクトごとの開発に使用されているブランチです。大きな機能開発や、複数人での開発がここでおこなわれています。
OpenPNE2.12ではXHTML+CSSプロジェクトの成果物が入っていますが、これはxhtmlcssブランチの中で開発されていたものです。
このブランチのログを見れば、takai,nakasone,ogawa,tomizawa,kiwa,ebiharaなど複数人が協力して開発していることがわかります。
このプロジェクトの開発がある程度落ち着いた段階で、trunkに成果物が取り込まれました。取り込まれた成果物は、トランクコミッターが検証・修正したうえで、問題がなければ、新機能としてリリースされます。
個人開発用ブランチ
workブランチは各個人が自由に機能開発や改善、バグ修正などをおこなうためのブランチです。
各個人が自分の名前のついたブランチで開発をおこなっています(海老原の場合、ebihara以下)。
trunkやstableブランチなどはコードの品質やUI、使い勝手などを充分配慮して開発をおこなう必要がありますが、個人開発用ブランチにはこのような制約はありません。自由に使えるスペースなので、OpenPNEで追加してみたい実験的な機能開発など、様々な使い方をすることができます。
root/OpenPNE/branches/work ebihara imoto ishida kiwa ogawa ・ ・ ・
例として、work以下のebiharaディレクトリを見てみます。
海老原はトランクコミッターなので、OpenPNE開発版に実装される予定の大きな機能開発のためにブランチを利用していることが比較的多いのですが、OpenPNEフレームワークのリファクタリング用ブランチなど、実験的な取り組みにも積極的に個人開発用ブランチを利用しています。
この様に、prjとworkにはプロジェクトで開発するか個人で開発するかかという大きな特徴があります。
この特徴を念頭に置きながらtrac.openpne.jpを見ていただくと、「お! この機能はプロジェクトとして動いてるんだ」「この機能はogawaさんが個人で開発しているけど本線に取り込まれるのかな」など、OpenPNEの最新の動向と今後の方向性も見えてくるかも知れません。
ブランチの作り方
それでは、海老原が実際にどのようにしてブランチを作っているか、実際に作業をしながら紹介します。
ここでは、「svnコマンドを使った方法」と「TortoiseSVNを使った方法」の二種類を紹介します。ここで紹介するのはほんの一例ですので、それぞれが気に入った方法でチャレンジしてみてください。
TortoiseSVNを使った方法
TortoiseSVNは、SubversionのWindowsクライアントソフトを使用します。まだインストールをされていない人は次に紹介するサイトからダウンロードしてみてください。
TortoiseSVN Subversion クライアント for Windows http://tortoisesvn.net/docs/nightly/TortoiseSVN_ja/index.html
ブランチの作成
それでは早速ブランチの作成に入ります。
OpenPNE/branches/work/ebihara以下に実際にブランチを作りながら、解説していきます。
適当なディレクトリで右クリックして、メニューの中から「Repo-browser」をクリックします。
クリック後に、URLというウィンドウが出てくるので、そのURL欄にSVNのURLを入力します。
https://trac.openpne.jp/svn/
入力後に「Repository Browser」という新しいウィンドウが開きSVNを見ることができるようになります。
次に、OpenPNEの最新安定版からブランチを作ります。
タグ(OpenPNE/tags)からコピーすることで、特定のバージョンから派生したブランチを作成することができます。今回はOpenPNE/tags/stable/OpenPNE-2.10.3からブランチを作ることにします。画面内で「OpenPNE-2.10.3」とある箇所で右クリックをすると、下記の画像のようなメニューが表示されるので、「Copy to...」を選択します。
「New name:」という入力フォームが出るので、レポジトリ上のコピー先URLを指定します。今回は、work以下のebiharaブランチにOpenPNE2.10.3からの派生ブランチ(prj_remove_globals)を作るので下記のURLを指定して「OK」ボタンを押します。
「Log:」という入力フォームが出るので、どのようなブランチを作成したのかという説明を書きます。これは、trac.openpne.jpのTimelineに記録されます。何も書かずに作成することもできますが、後から流れが追いづらくなるので、できるだけ記述するようにしてください。
これで、ブランチを作成することができました。
指定したバージョンがコピーされているかの確認はwebapp/version.phpを開いてOPENPNE_VERSIONを確認すると一目瞭然かと思われます。
https://trac.openpne.jp/svn/OpenPNE/branches/work/ebihara/prj_remove_globals/
<?php define('OPENPNE_VERSION', '2.10.3'); ?>
チェックアウト
これでレポジトリにブランチを作成することができました。
あとは作業用にレポジトリにあるソースコードをチェックアウトします。
チェックアウトとは、 リポジトリで管理されたファイルをローカルディレクトリに取得する作業のことです。
まず、チェックアウトしたいローカルディレクトリに移動して、右クリックメニューを表示し、「SVN Checkout...」をクリックします。
クリックすると、Checkoutという新しいウィンドウが表示されます。
「Repository」の中に「URL of repository」「Checkout directory」とあるので項目を入力します。
URL of repository リポジトリのURL 例)https://trac.openpne.jp/svn/OpenPNE/branches/work/ebihara/prj_remove_globals/ Checkout directory チェックアウトしたいローカルディレクトリ 例)C:\\example\prj_remove_globals
OKを押すと、チェックアウトが始まります。
チェックアウトが終了すると、ローカルのprj_remove_globalsディレクトリにソースがコピーされています。
あとは、このソースコードを修正などしたりし、コミットすれば、branches/work/ebihara/prj_remove_globals/のソースコードが修正されています。
コミットとは作業した結果をリポジトリに登録することです。
フォルダ上で右クリックから「SVN Commit...」メニューを選択し、OKを押せば簡単に作業した結果をリポジトリに反映することができます。
まとめ
この様に、TortoiseSVNを使用することで、GUIで簡単にブランチの作成、チェックアウト、コミットを行うことができます。
チェックアウトしたソースコードはWindowsのエクスプローラー上で、通常のファイルと同じように扱うことができるので、是非おすすめしたいツールです。
svnコマンドを使った方法 ==
svnコマンドを使用するには、Subversionをインストールする必要があります。詳しいインストール方法は割愛しますが、Debian系のデストリビューションであればapt-getコマンド、CentOS系のデストリビューションであれば、yumコマンドで取得できます。
Debian系 apt-get install subversion
CentOS系 yum install subversion
ブランチの作成
svn copyコマンドを使ってブランチを作成します。
レポジトリ上のコピー元URL、コピー先URL(作成したいブランチのURL)を引数として指定します。
例) $ svn copy https://trac.openpne.jp/svn/OpenPNE/tags/stable/OpenPNE-2.10.3/ https://trac.openpne.jp/svn/OpenPNE/branches/work/ebihara/prj_remove_globals/
チェックアウト
次に、リポジトリのソースコードをチェックアウトします。
チェックアウトにはsvn coコマンド(svn checkoutコマンドでも可)を使用します。チェックアウトしたいレポジトリのURLと、チェックアウト先のディレクトリを引数に指定します。
例) $ svn co https://trac.openpne.jp/svn/OpenPNE/branches/work/ebihara/prj_remove_globals/ prj_remove_globals
コマンドの説明
Subversion には前に使ったもの以外にも様々なコマンドがあります。詳しくはSubversionのヘルプを参照してください。
Subversion のコマンドヘルプ
svn --help
Subversion のコピーコマンドヘルプ
svn copy --help
マージ
マージする方法を説明していきます。
マージを直訳すると、「合併する」「融合する」といった意味なります。つまり、Subversionでは、ソースコードとソースコードを融合させるといった意味になります。マージとは、あるリビジョンからあるリビジョンでの変更箇所を取り込む作業です。
先ほどブランチとしてtrunkから派生させたコードをまたtrunkにマージするなど、様々な作業にマージを活用しています。
それでは、ブランチと同じく、「TortoiseSVNでマージする方法」と「SVNコマンドでマージする方法」のニ種類を紹介します。
マージにはさまざまな種類がありますが、ここでのマージは、個人のローカル作業用ディレクトリにtrunkの変更箇所をマージする方法を紹介します。
TortoiseSVNでマージする方法
「TortoiseSVNでブランチを作る方法」と同じく、TortoiseSVNを使ってマージしていきましょう。
まず、TortoiseSVNでマージする方法ですが、先ほどのブランチでの使い方同様TortoiseSVNのメニューは右クリックをすることでメニューを開くことができます。 今回はマージさせたいディレクトリの上で、右クリックをし、「TortoiseSVN」を選択し「Merge...」を選択します。
「Merge...」を選択したらMergeウィンドウが表示されます。 マージをする上で一番分かりにくい点は、この【From】と【To】だと思います。先ほど、「マージは基本的に、あるリビジョンからあるリビジョンでの変更箇所を取り込む作業」と述べましたが、それがここと一致します。この【From】と【To】の間で変更された箇所を取り込みます。URLには、取り込みたい先のリビジョンのURLを指定します。
From:マージしたい範囲の最初のリビジョンの一つ手前のリビジョン To:マージしたい範囲の最後のリビジョン
この様にFromとTo指定して、Mergeを押すだけで、そのリビジョン間の変更箇所がローカルの作業ディレクトリにマージされます。
ここで悩む人が多いのが「From」の指定です。リビジョン5115の修正を取り込みたいときは、画像のように、
From:5114 To:5115
と指定する必要があります。
SVNコマンドでマージする方法
SVNコマンドでマージする方法を紹介していきます。
それではTortoiseSVNと同じように、リビジョンを指定して変更箇所をローカルの開発ディレクトリにマージしていきます。
まずは、作業ディレクトリに移動してください。
$ cd ./working-directory
次に、SVNのsvn mergeコマンドを使ってマージします。
svn mergeコマンドは下記のように指定します。この-rオプションというのはリビジョン指定をするときには必要なので忘れないように注意が必要です。
この例を解説すると、trunkの5114から5115の変更点をローカルのprj_remove_globalsディレクトリにマージするという意味になります。
svn merge -r 最初のリビジョン:最後のリビジョン SVNのURL マージ先のローカルディレクトリ名 $ merge -r 5114:5115 https://trac.openpne.jp/svn/OpenPNE/trunk/ prj_remove_globals