はじめに
ソース管理はソフトウェア開発で重要な役割を果たします。チーム開発はもちろんのこと、自分1人での開発でも効果は絶大です。アプリケーション開発をスムーズに管理できますし、プロジェクトをきちんとバックアップしたり、ファイルレベルやプロジェクトレベルで以前の状態にロールバックできる点も安心です。私は最近、オープンソースのSubversionとTortoiseSVNを使い込んでいます。満足の行くソース管理ツールにやっと巡り合えたという思いです。この記事では、Visual StudioプロジェクトでSubversionとTortoiseSVNを利用する方法について、ひととおりの基礎知識を説明します。ここでは、Subversionのインストールと設定から、TortoiseSVNでローカルのVisual Studioプロジェクトを扱うための基本的な操作までを示します。Subversionの詳細な解説は他に譲り、とりあえず使い始めるまでに必要な知識だけを、順を追って説明していきます。
編集部注
Subversionとは
Subversionはオープンソースのソース管理リポジトリツールです。オープンソースプロジェクトで広く使われており、一般の大規模開発での利用も次第に増えつつあります。動作は高速かつスムーズで、サイズが小さくインストールも簡単です。しかもオープンソースのため、無償で利用できます。ファイルベースによる管理で、シンプルなディレクトリ構造のリポジトリを使用するため、コピーやバックアップも容易です。TortoiseSVNはSubversionをグラフィカルに利用するためのツールで、エクスプローラのシェル拡張として動作します。 Subversionのコマンドラインインターフェースの代わりに、エクスプローラのコンテキストメニューで対象ファイルを操作したり、アイコンのオーバーレイでファイルの状態を把握したりできます。使い慣れたエクスプローラのインターフェースをソース管理に利用できるのは大きなメリットです。そのうえ、管理対象のファイルと実際のディレクトリ構造との関係が一目瞭然で、どのファイルがソース管理の配下にあるかがすぐに分かります。
Subversionのソース管理は「コピー・修正・マージ」モデルで行われます。ファイルをロックしたり、1人のユーザーがファイルを独占したりといった方法ではなく、変更を加えた部分をソースファイルにマージするというやり方です。マージできない変更がある場合(複数のユーザーが同じ行に 変更を加えた場合など)にのみ、競合が通知されます。
私はVisual Studioの統合セキュリティに慣れていたため、マージという考え方に最初は半信半疑でした。しかし実際に使ってみると、極めて円滑に開発作業を進められることが分かりました。チェックアウトとチェックインを頻繁に繰り返したり、他ユーザーとの絡みでファイルをロックしたりという面倒がありません。コードに対し必要な作業を行い、完了後にTortoiseSVNですべての変更をチェックインするだけです。Visual SourceSafeやVaultなど、統合型のソースコード管理ツールを使ってきた人なら、ソース管理がVisual Studioと統合されていないのは言語道断に思えるかもしれません。私も最初は、Visual Studioに統合できないことを心配に思っていました。しかしいざ使ってみると、その点はまったく苦になりません。むしろ、統合型のソース管理ツールで発生していた問題に遭遇せずに済みます。統合型のツールでは、ソース管理の動作がおかしくなることがよくあり、複雑なVisual Studioソリューションや共有プロジェクトの場合には特に顕著でした。そのたびにVisual Studioやソース管理ツールでの対処が必要になって以前はイライラしていましたが、Subversionではそのようなことはありません。
Subversionはファイルシステムを追跡する仕組みが基盤となっているため、基本的にはどんなツールとの組み合わせでも利用できます。実際私は、.NETプロジェクトと古くからのFoxProプロジェクトの両方でSubversionを利用しています。同じ手順に従って統一感のある操作が可能です。さらにSubversionなら、ドキュメントからサポートファイルに至るまで、通常はVisual Studioプロジェクトに入っていないファイルも含めて、すべての種類のファイルを保存できます。
インストール
まずは、SubversionとTortoiseSVNをダウンロードしましょう。インストールは、Subversionの後にTortoiseSVN という順番で行います。さらに、Visual Studioと統合したい場合は、VisualSVN(49ドル)やAnkh(フリー)といったツールもあります。TortoiseSVNはSubversionのGUIフロントエンドとして動作します。バージョンが違うと対応できない場合がありますので、両方とも最新バージョンをインストールするようにしましょう。
注1
VisualSVNはVisual Studioと統合できますが、UIの大半はTortoiseSVNと同一です。
リポジトリの作成が不要で、既存のリポジトリのローカルコピーを作成する方法のみを知りたい方は、「リポジトリからローカルにファイルのコピーを取得」の節までお進みください。
TortoiseSVNの設定
最初に、TortoiseSVNの設定に小さな変更を1つ加えておくことをお勧めします。それは、ローカルのSVNリポジトリの名前を.svnから _svnに変えるという設定です。Visual Studioでは、先頭がピリオドのフォルダ名で問題が発生するため、_svnとしておく方が安全です。特に、Visual Studio統合型のツールに後で移行する可能性がある場合には必要になります。TortoiseSVNのインストールが完了した状態で、エクスプローラでファイルまたはフォルダを右クリックし、ショートカットメニューの[TortoiseSVN]を選択して、[Settings]を選択します。次に、[General]タブの[Use '_svn' instead of '.svn'(".svn"ディレクトリの代わりに"_svn"を利用する)]チェックボックスをオンにします(図1を参照)。
図1 TortoiseSVN設定の[General]タブ。Visual Studioでは、フォルダ名の先頭がピリオドの場合に問題が発生するため、.svnではなく_svnを使用するようにTortoiseSVNの設定を変更しておくことをお勧めします
私のガールフレンドを行ってください
TortoiseSVNによるリポジトリの新規作成
次に、新しいリポジトリの作成に進みます。リポジトリとは、TortoiseSVNが使用するディスク上の保存領域のことで、バージョン管理の対象となる全データがその中に保存されます。リポジトリの作成場所は、ローカルマシンでもよいですし、ユーザーがアクセス権を持つリモートサーバでも構いません。リモートサーバへのアクセスには、Subversionのデーモンサービスを用いる方法と、別途インストールしたApacheモジュールでHTTPを用いる方法があります。いずれの場合も、リポジトリを作成したマシン上でサービスが稼動している必要があるという点が肝心です。リポジトリの作成では、メインのリポジトリとなるメインフォルダをまず作成します。私はいつも、検索やバックアップが簡単なように、最上位レベルのフォルダを使うよ うにしています。そこで、例えば「d:\subversion」のようにフォルダを決めたうえで、次の操作を行います。
- フォルダ「d:\subversion」を作成します。
- [TortoiseSVN]を右クリックし、[Create repository here.(ここにリポジトリを作成)]を選択します。
- このリポジトリのアクセス許可を設定します。
[general] # anon-access = read auth-access = write password-db = passwd realm = SummaLp
次にパスワードファイル(ファイル名は拡張子なしの「passwd」)を編集し、アクセスを認めるユーザーを、ユーザー名とパスワードのペアの形で設定します。次のような形式です。
[users] ricks = wonkiewind billp = haggard
Subversionをサービスとして起動する設定
リポジトリを作成したら、次はリモートからアクセスできるようにするための設定です。方法は2つあります。1つは、Subversionに内蔵のデーモンサーバを使い、TCP/IP接続(デフォルトポートは3690番)経由でリポジトリのデータを取得する方法です。もう1つは、Apacheと Apacheモジュールを使い、HTTP経由でリポジトリに接続する方法です。デーモンを使ったTCP/IP接続はSubversionにネイティブの方法で、セットアップも簡単です。速度の面でもHTTP方式より優れています。一方、HTTP方式はApache経由で動作するため、セキュリティや認証の面で優れており、アクセスも80番ポートで可能です。この記事では、TCP/IPデーモンサービスを利用する方法のみを説明します。このサービスは、Subversionのインストール先の「BIN」ディレクトリにある「SvnServe.exe」です。このファイルを手動で実行しても動きますが、サービスとしてインストールする方が断然お勧めです。それには、次のコマンドラインを実行します(バッチファイルにするとよいでしょう。全体を1行で記述してください)。
sc create svn binpath= "\"c:\programfiles\subversion\bin\svnserve.exe\" --service -rd:\subversion" displayname= "Subversion Server" depend= Tcpip start= auto
別のポートを使用したい場合は、「listen-port=nn」と追加します。nnはポート番号です。その他のオプションについては、ドキュメントを参照ください。
サービスを開始するには、サービスマネージャかコマンドプロンプトを使います。コマンドは次のようにします。
これが必要なのは最初の1回のみです。上記のコマンドでサービスをインストールした場合、次回のWindowsの起動時からはサービスも自動的に起動します。リポジトリの動作確認
リポジトリの動作を確認するために、任意の場所でTortoiseSVNを起動し、IPアドレスかホスト名を使って接続を試してみます。エクスプローラを開き、右クリックして、ショートカットメニューの[TortoiseSVN]を選択し、[Repo-browser.]を選択します。「svn:///」と入力すると、作成したリポジトリが表示されるはずです。リモートマシンにリポジトリをインストールした場合は、IP アドレスかドメイン名を使います。ノードをダブルクリックしてリポジトリを開いてみましょう。エラーメッセージが表示されるようなら、リポジトリに接続できていません。ローカルマシンのリポジトリであれば、普通は問題ないはずです。接続できない場合は、サービスの登録時に指定したリポジトリとパスに誤りがないか確認してください。リモートマシンのリポジトリの場合は、サーバが待機しているポートへの通信が接続側とサーバ側のファイアウォールを通過できるかどうか確認してください。デフォルトのポートは3690番です。
エラーなしでリポジトリを開けるようになったら、Subversionによる共有ソース管理の準備は完了です。
ソース管理へのプロジェクトとファイルの追加
ここからは、Visual StudioのプロジェクトをSubversionのソース管理に追加する方法を見ていきます。前述のとおり、TortoiseSVNにはVisual Studioへの統合機能はなく、ディレクトリとファイルのレベルでソース管理が行われます。基本的には、ソース管理にはどんなファイルやディレクトリでも追加できます。つまり、どのアプリケーション用のファイルであっても、Subversionで管理できます。まず、リポジトリの構造を決める必要があります。プロジェクトの数が多い場合は、きちんとグループ化できる構造の方がよいでしょう。私の場合、大抵は次のような構造にします。
medicallケアの最新トレンドは何ですか
Repository -- ProjectGroup1 (ie. Solution level) ----Project ----Project ----Project ----Project -- ProjectGroup2 (ie. Solution Level) ----Project ----Project
この記事では、次のようなフォルダ構造を使うことにします。
Repository -- SummaLp ---- SummaLpManager ---- SummaLpBusiness ---- SupportAssemblies
最上位フォルダの新規作成
TortoiseSVNでプロジェクトを作成するときには少々工夫が必要です。サーバにファイルやフォルダをインポートするのは簡単ですが、インポートした内容が、自動ではローカルにチェックアウトされません。しかも、インポートの完了後すぐにチェックアウトすることもできません。ソース管理の対象でない既存のファイルをTortoiseSVNで上書きすることはできないからです。こうしたことから、インポート機能は使わないのが1番です。代わりに、リポジトリに空のフォルダを作成してから、そのフォルダをチェックアウトし、ファイルやサブフォルダを手動で追加するという方法をとることにします。ここでは、図2と図3に示すやり方で、「SummaLp」という最上位フォルダを作成します。
図2 フォルダの新規作成。リポジトリに新しい空のフォルダをまず作成し、チェックアウトしてから、ファイルを追加するという方法が無難です
図3 ファイルの追加。フォルダができたら、リポジトリにファイルを追加します
- 右クリックし、[TortoiseSVN]を選択して、[Repo-browser.]を選択します。
- [Create Folder]を選択して、メインリポジトリの直下に新しい最上位フォルダを作成します。フォルダ名は「SummaLp」とします。
- エクスプローラに戻り、「SummaLp」フォルダに移動または作成します。
- このフォルダを右クリックし、[Checkout…]を選択します(図4を参照)。
- リポジトリの最上位フォルダを選択し、対応するローカルパスを指定します(図5を参照)。
図4 ファイルのチェックアウト。ファイルをチェックアウトするには、メニューの[SVN Checkout…]を選択します。
図5 チェックアウト。チェックアウトを実行すると、指定のローカルフォルダに対し、ファイルとフォルダがリポジトリからコピーされます
図6 ソース管理のアイコン。ソース管理の配下にあるフォルダとファイルには、アイコンのオーバーレイが表示され、チェックアウトの状態が分かるようになっています
いずれかのプロジェクトフォルダを選択し、先ほどと同様の手順でフォルダの作成を進めます。
- TortoiseSVNでリポジトリを参照します。
- 「SummaLp」フォルダの下にサブフォルダを作成し、プロジェクトの名前「SummaLpManager」を付けます。
- エクスプローラで、対応するフォルダにチェックアウトします。これで、プロジェクトフォルダがソース管理の配下に置かれます。
- ファイルとフォルダを選択し、右クリックメニューから[Add]を実行します(図7を参照)。
図7 ファイルの追加。メニュー項目の[Add]を使用して、ソース管理とリポジトリにローカルからファイルを追加できます
ファイルを追加し終えた後でフォルダを見てみると、各ファイルのアイコンにプラス記号が付いているはずです。この記号は、ローカルストアに追加しただけのファイルを表します。まだサーバと同期していないという意味です。
サーバと同期するには、プロジェクトフォルダを右クリックし、[SVN Commit]を選択します(図8を参照)。
図8 変更または追加したファイルのコミット。変更または追加したファイルをリポジトリにコミットするには、[SVN Commit]を使用します
コミットが完了すると、ローカルコピーは最新の状態となります(図9を参照)。これで、リポジトリの同期がとれました。
図9 同期後のローカルコピー。すべてのファイルを追加してチェックインし終えると、緑色のチェックマークが付いた最新状態のリポジトリとなります
誰がアドキンスの食事を作成しました?
図10 リポジトリブラウザの表示。リポジトリブラウザでは、リポジトリに格納された全ファイルを参照できます。現時点では、ローカルに置かれた作業用ファイルと一致しています
以上で、リポジトリの準備が完了し、共有して使える状態になりました。新しい階層を作成して新しいファイルをリポジトリに追加する大まかな手順をまとめると、次のようになります。
- リポジトリに空のフォルダを作成する。
- そのままローカルフォルダにチェックアウトする。
- TortoiseSVNを使ってエクスプローラでファイルを追加する。
- 変更をコミットする。
リポジトリからローカルにファイルのコピーを取得
ここまで説明した手順は、最初にリポジトリを作成するときに1回だけ必要な操作でした。一方、開発者がリポジトリに接続して最新リビジョンのコピーを初めてローカルマシンに取得するときの操作はずっと簡単です。- ローカルコピーの格納場所となるフォルダを決めます。
- 右クリックし、[SVN Checkout]を選択します(図4を参照)。
- リポジトリを開き、リポジトリ内のプロジェクトフォルダと、チェックアウトしたファイルを取得するローカルフォルダのパスを指定します。本記事の例では、最上位フォルダの「SummaLp」を選択します。これで[Checkout]を選択すれば、プロジェクト全体とソリューションファイルを取得できます。
セットアップの後処理
プロジェクトをローカルマシンに取得した後で、プロジェクトの設定が必要な場合があります。例えば、ASP.NETのWebアプリケーションのプロジェクトであれば、仮想ディレクトリの登録、ディレクトリのアクセス許可の設定、スクリプトマップの追加などが必要になることがあります。また、リポジトリの構成や内容によっては、プロジェクトで必要な依存ファイルが入っていないことがあります。プロジェクトで必要なサポートアセンブリは、他のユーザーができるだけ簡単に取得できるようにしておくのがよいでしょう。私の場合は、各ソリューションのリポジトリに「SupportAssemblies」というフォルダを作成し、プロジェクトで必要となる外部アセンブリをまとめて格納しておくことがよくあります。そして、各プロジェクトでそ� ��らのアセンブリを関連付けておきます。こうすれば、全開発者が同じバージョンの外部アセンブリを利用することになります。
ただし、GACのコンポーネントの場合には話が少々ややこしくなり、各ユーザーのマシンで適切なコンポーネントが登録されている必要が出てきます。私はこの場合も、ライセンスやその他の面で可能であれば、上記と同様に「SupportAssemblies」フォルダでコントロールを配布するという方法を選び、各開発者がスムーズに作業を進められるようにします。依存関係についてはドキュメントにまとめ、プロジェクトに「Readme」ファイルを同梱しておくことをお勧めします。
TortoiseSVNによるSubversionの主な操作
ここまでで、ソース管理による作業の準備が整いました。前述のとおり、Subversionは「コピー・修正・マージ」モデルですので、明示的に指定しない限りはファイルのロックは行われず、ソースファイルは自由に修正できます。基本的には、ファイルの編集を普通に行えば、Subversionが変更を把握してくれます。変更を加えたファイルかどうかは、TortoiseSVNのエクスプローラ統合機能で確認できます。すなわち、ファイルのアイコンに赤色の感嘆符が付いていれば、自分が加えた変更をサーバに反映していないという意味です。
この感嘆符は、ファイルだけでなくフォルダにも表示されます。配下に未更新の変更があるフォルダという意味です。また、感嘆符の意味を勘違いしないよう注意してください。別のユーザーが修正し� �という意味ではなく、あくまで自分自身が修正したという意味であり、コミットが必要であることを表しています。
Subversionサーバに変更内容を反映して同期するには、図8の[SVN Commit]を選択します。図11のようなダイアログボックスが表示され、コミット処理で更新される全ファイルをその場で確認できます。また、対象外とするファイルを指定することもできます。例えば、「web.config/app.config」や、特別なビルド手順があるときのプロジェクトファイルなど、あえて更新しないファイルがある場合に役立ちます。
図11 修正を加えたファイル。変更を加えたファイルには赤色の感嘆符が表示されます。コミットが必要という意味です
図12 変更されたファイルの確認。[SVN Update]では、他ユーザーが変更したリポジトリ内のファイルを確認および選択できます
大抵は、まず更新を実行し、プロジェクトを再コンパイルしたうえで、自分の修正をリポジトリにコミットするのがよいでしょう。こうすれば、マージ後の内容でビルドが失敗しないことを確認できます。また、一般論としては、少し修正を加えるごとにこまめにコミットし、リポジトリをできるだけ最新の状態に維持する方がよいでしょう。
注3
チェックアウトの時間を短めにするほど、競合も少なくなります。
[Check for Modifications]コマンドでは、ローカル側とサーバ側とで内容に違いがあるすべてのファイルが一覧表示されます。いずれかのファイルをクリックすると、差分ビューアが表示されます。TortoiseSVNに標準装備された差分確認ツール(図13を参照)では、ローカル側とサーバ側のファイルの内容が横並びで表示され、違いを確認できます。
図13 差分の確認。標準装備の差分確認ツールでは、ローカル側のファイルとリポジトリ側のいずれかのバージョンとの違いをすばやく確認し、ローカルのファイルを更新できます
注4
SubversionとVisual Studio
Visual Studioへのサポートに関しては、これと言って特筆すべき点はありません。SubversionもTortoiseSVNも、Visual Studioの外部で別個に動作するからです。従って、Visual Studioで使用するファイル同士の関係(例えば.aspxファイルとaspx.csファイルの関係)については、Subversionや TortoiseSVNは一切把握していません。各ファイルはいずれも、独立した別個の存在として扱われるため、ファイル同士の関係については自分で管理し、すべてのファイルのチェックインや更新を明示的に行う必要があります。プロジェクトやソリューションを扱うときには、それらに含まれる設定にも要注意です。他のユーザーで問題が生じる設定がないかどうか、念入りに確認する必要があります。例えば、SQL Serverのローカルコピーに接続するときのサーバ名が他のユーザーと違ったり、ローカルに作成したWebの仮想パスがメインアプリケーションと一致しなかったり、ローカルパスがリポジトリのプロジェクトと異なったりするケースがあります。
場合によっては、プロジェクトファイルやソリューションファイルは、チェックアウトしたらずっとそのままにする必要があるかもしれません。ローカル設定に応じて変更した部分をリポジトリに反映させないためです。チームのすべての開発者が共同で使えるような設定にできたら理想的ですが、必ずしも可能とは限りません。.configファイルの中で各自の個別対応が必要な部分をドキュメントに残しておくと、新しく加わった開発者にも分かりやすく、非常に有効です。
Visual SVN
Visual Studioの中でソース管理機能を直接使用したければ、VisualSVNという選択肢があります。TortoiseSVNの機能をVisual Studioに直接統合できるツールです(図14を参照)。VisualSVNは既存のSubversionのフォルダに対して動作するもので、 Visual Studioのバージョン管理プロバイダ(SCC)は使用しません。TortoiseSVNのAPIを利用して、リポジトリのデータを直接取得します。図14 Visual Studioとの統合。VisualSVNならTortoiseSVNをVisual Studioに直接統合できます
私はVisualSVNをしばらく前から使っているものの、今でもふと気が付くと、エクスプローラのシェル統合機能を使ってしまうことがたびたびあります。その方が手っ取り早いからです。とはいえ、ファイルの状態をVisual StudioのIDEで確認できるのは確かに便利です。また、新しいファイルを頻繁に追加する場合にも役立ちます。VisualSVNがファイルの関連付けを認識し、関連する全ファイルを自動で追加してくれます。
VisualSVNは有料のソフトウェアで、ユーザー1人につき49ドルかかります。でも、Visual Studioへの統合を必要としているなら、それだけ払う価値は十分にあります。
Visual StudioにSubversionの機能を追加するアドインは他にもいくつかあります。その1つが、Ankhというフリーのツールです。ただ、私の所ではいくつか問題があり、ずっと前から試していません。Ankhの開発はずいぶん前に止まったようですので、もはや過去のツールと言えるのかもしれません。
開発作業を大きく変える恵みのツール
Subversionを導入して、私の開発作業はがらっと変わりました。まさに恵みのツールです。私はこれまで、ソース管理を断続的にしか使ってきませんでした。Visual Studio用のさまざまなソース管理ツールでいろいろな問題に遭遇したからです。プロジェクト開発や個人的な作業で何種類かのツールを使ってきましたが、問題の大半は、各ツールではなくVisual Studioそのものに起因しているように感じられました。それで、しばらくソース管理を使っても、面倒になってやめてしまう、ということを繰り返してきました。しかし、Subversionを使い始めてからは、問題点やプロジェクトの互換性などに関して、何の不満もありません。複数のソース管理リポジトリにまたがってプロジェクトを使うのにも支障はなく、納得の出来栄えです。今では私は、すべてのプロジェクトでソース管理を利用しています。完全にローカルで行う自分用の作業であってもです。ソース管理は、面倒な厄介者ではなく、縁の下の力持ちとして、生産性を高めてくれなくてはと思います。その点、Subversionは言うことなしです。
この記事では、Subversionの導入から基本操作まで、初歩的な内容のみを取り上げました 。Subversionは、最先端のソース管理システムに求められる高度な機能も搭載しており、必要に応じて利用できます。しかし最初のうちは、基本機能を使い込んで、操作や仕組みへの理解を十分に深めておきましょう。基本機能だけでも、ソースコードのセキュリティ強化や複数の開発者での適切な共有など、導入のメリットは極めて絶大です。
0 件のコメント:
コメントを投稿