Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

NAntでVisual Source Safeの操作を自動化する

ファイルのチェックアウト・編集・チェックインの自動化

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2006/12/04 00:00

NAntとは、Ant(Javaのビルドツール)の.NET版ツールです。開発時の作業自動化や作業の負荷軽減が可能になるため、手動で行っていた修正作業を短時間で正確に行えるようになります。本稿ではこのNAntおよび、NAntContribのVSS関連タスクを利用して、Visual Source Safe(VSS)の操作からファイルのチェックアウト、編集、コメント付のチェックインまでを自動で行います。

目次

はじめに

 NAntとは、Ant(Javaのビルドツール)の.NET版ツールです。さまざまなタスクやファンクションが用意されていて、開発時の作業自動化や、作業の負荷軽減が可能になる便利なツールです(2006/11/27時点の最新バージョンは0.85)。NAntに関する詳細は、別稿『NAntを活用して開発時の作業を自動化する』も併せて参照してください。NAntContribはNAntの拡張版であり、NAnt用のアドオンタスクが含まれています。

 本稿ではこのNAntおよび、NAntContribのVSS関連タスクを利用して、Visual Source Safe(VSS)の操作からファイルのチェックアウト、編集、コメント付のチェックインまでを自動で行います。これによって、手動で行っていた修正作業を、短時間で正確に行うことができるようになります。

対象読者

 Visual Studio.NETの開発者の方。Visual Source Safe(VSS)を利用している方。コンパイル/ビルド作業、インストーラ作成自動化に興味がある開発者の方。

必要な環境

 このサンプルは、NAnt バージョン0.85、NAntContrib バージョン0.85、Visual Source Safe(以下、VSS)2005、.NET Framework 2.0で動作確認を行っています。

 NAnt、および、NAntContribは、以下のサイトよりダウンロードしてください。

サンプルファイル(NAntSample_VCSharp2.zip)の使用方法

 サンプルファイルには、NAnt本体(バージョン0.85)、NAntContrib本体(バージョン0.85)、VSS DB、NAnt起動用バッチファイル、NAntサンプルスクリプトが含まれています。このサンプルを実行するにはVSSが必要です。

  1. ダウンロードファイルを「C:\」に解凍してください
  2. (配置先は「C:\NAntSample_VCSharp2」)
  3. NAntを実行するため、「NAntExecute.bat」をダブルクリックしてください(「NAntExecute.bat」起動時に、「NAnt.exe」のパスが環境変数に設定されます)

サンプルスクリプト処理の流れ

 サンプルスクリプト 処理の流れを、下図に示します。

サンプルスクリプト 処理の流れ
サンプルスクリプト 処理の流れ

 VSSに自動でログインし、編集したいファイルの一覧を作成、その情報をもとにファイルをチェックアウト、編集し、コメントを付けてファイルのチェックインを行います。

 以下にサンプルスクリプトの内容を解説していきます。

サンプルスクリプト:ターゲットごとの解説(1/2)

 このスクリプトは、以下の6つの、「設定」および「ターゲット」で構成されています。

  • プロジェクト設定/プロパティ設定
  • mainターゲット
  • VssLocateFilesターゲット
  • VssCheckoutFilesターゲット
  • UpdateAssemblyInfoFilesターゲット
  • VssCheckinFilesターゲット

 それでは、各「設定」および「ターゲット」について、解説していきます。

プロジェクト設定/プロパティ設定

 NAntスクリプト冒頭部分で、スクリプト内で利用する値をプロパティとして設定しておきます。何度も利用する値などを、まとめて設定しておくと便利です。

 ここでは、以下のプロパティを設定しています。

プロパティ一覧
プロパティ名説明
old.verアセンブリの旧バージョン(4桁の数字)
new.verアセンブリの新バージョン(4桁の数字)
temp.pathファイル編集作業用のワークスペース
vss.pathVSSのコマンドライン版であるss.exeのパス
userVSS DBのログインユーザー名
passVSS DBのログインパスワード
local.pathVSSのローカルワークスペース
ssdirVSS DBの設定ファイル(~.iniファイル)のパス
exList編集対象から除外するVSS DBのプロジェクト

 また、今回のサンプルに含まれるVSS DBのディレクトリ構成は下図のようになっています。

VSS DBのディレクトリ構成
VSS DBのディレクトリ構成

 このうち、exListプロパティで設定した「$/Prj3」プロジェクト、「$/Prj4/Prj4-1」プロジェクトは、編集の対象としません。

mainターゲット

 mainターゲットは、メインとなる処理を行うターゲットです。

mainターゲット 処理の流れ

  1. ファイル編集作業用のワークスペースを作成します。
  2. 新旧アセンブリバージョンのプロパティ値を設定します。
  3. VSSに対する操作、および、アセンブリ情報ファイル編集に利用するプロパティ値を設定します。
  4. VssLocateFilesターゲットを実行します。このターゲットは、VSS DBに存在する「AssemblyInfo.cs」ファイルを検索し、ファイル名の一覧を作成します。
  5. VssCheckoutFilesターゲットを実行します。このターゲットは、ファイル名の一覧に存在する、すべての「AssemblyInfo.cs」ファイルをチェックアウトします。
  6. UpdateAssemblyInfoFilesターゲットを実行します。このターゲットは、すべての「AssemblyInfo.cs」ファイルに内に記述されているアセンブリバージョン情報を編集します。
  7. VssCheckinFilesターゲットを実行します。すべての「AssemblyInfo.cs」ファイルについて、コメント付きでチェックインします。
nant.build内のmainターゲット
<target name="main" depends="" >
  <!-- 1. -->
  <mkdir dir="${temp.path}" />
  <!-- 2. -->
  <property name="new.ver.long" value="${string::substring(new.ver, 0, 1)}
  .${string::substring(new.ver, 1, 1)}.${string::substring(new.ver, 2, 1)}
  .${string::substring(new.ver, 3, 1)}" />
  <property name="old.ver.long" value="${string::substring(old.ver, 0, 1)}
  .${string::substring(old.ver, 1, 1)}.${string::substring(old.ver, 2, 1)}
  .${string::substring(old.ver, 3, 1)}" />
  <!-- 3. -->
  <property name="rcs.target"  value="AssemblyInfo.cs*" />
  <property name="comment"  value="Changed version to ${new.ver}." />
  <property name="fileList"  value="${temp.path}\AssemblyInfoList.txt" />
  <!-- 4. -->
  <call target="VssLocateFiles" />
  <!-- 5. -->
  <call target="VssCheckoutFiles" failonerror="false" />
  <!-- 6. -->
  <call target="UpdateAssemblyInfoFiles" failonerror="false" />
  <!-- 7. -->
  <call target="VssCheckinFiles" />
</target>

 次に、mainターゲット内で実行される各ターゲットの詳細を、説明していきます。

VssLocateFilesターゲット

 VssLocateFilesターゲットは、ソース管理にあるファイルをワイルドカードで検索し、該当するファイルの名前を、指定されたファイルへ出力します。

VssLocateFilesターゲット 処理の流れ

  1. VSSのコマンドライン版である「ss.exe」を実行し、ファイルリスト作成用一時ファイル(${fileList}.tmp)に出力します。VSS DBに存在するファイルやディレクトリの検索には、「ss.exe」のLocateコマンドを利用します。
  2. 「ss.exe」を実行するために、環境変数「ssdir」を作成して、操作対象とするVSS DBのディレクトリを設定します。
  3. execタスクのenvironment属性を利用して、環境変数「ssdir」を指定、arg属性を利用して、LocateコマンドおよびVSS DBのユーザー名を指定します。
  4. fileListプロパティで指定されたファイルリストが存在する場合、削除します。
  5. 編集対象のファイルリストを作成するために、ファイルリスト作成用一時ファイルを読み込み、各行について、5.~7.の処理を繰り返します。
  6. 編集対象かどうかを判定するフラグとして、isValidプロパティを定義します。
  7. パスが「$」で始まっていない行は、フラグを「false」とし、編集対象から除外します。
  8. exListプロパティで指定されたプロジェクトに存在するファイルは編集対象外なので、フラグを「false」にします。
  9. フラグが「true」の行のファイルに関しては、fileListプロパティで指定されたファイルリストに出力します。
  10. 全行の読み込みが終了したら、ファイルリスト作成用一時ファイルを削除します。
nant.build内のVssLocateFilesターゲット
<target name="VssLocateFiles" depends="" >
  <!-- 1. -->
  <exec program="${vss.path}\ss.exe" output="${fileList}.tmp" >
    <!-- 2. -->
    <environment>
      <variable name="ssdir" value="${ssdir}"/>
    </environment>
    <!--3. -->
    <arg line="Locate ${rcs.target} -Y${user}" />
  </exec>
  <!-- 4. -->
  <delete file="${fileList}" if="${file::exists(fileList)}" />
  <!-- 5. -->
  <foreach item="Line" in="${fileList}.tmp" property="path">
    <!-- 6. -->
    <property name="isValid" value="true" />
    <!-- 7. -->
    <if test="${not string::starts-with(path, '$')}" >
      <property name="isValid" value="false" />
    </if>
    <!-- 8. -->
    <foreach item="String" delim=";" in="${exList}" property="exPath" >
      <if test="${string::starts-with(path, exPath)}" >
        <property name="isValid" value="false" />
      </if>
    </foreach>
    <!-- 9. -->
    <if test="${isValid=='true'}" >
      <echo file="${fileList}" message="${path}" append="true" />
    </if>
  </foreach>
  <!-- 10. -->
  <delete file="${fileList}.tmp" />
</target>

  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • WINGSプロジェクト 齋藤 利佳(サイトウ リカ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XMLD...

バックナンバー

連載:NAntスクリプトによるビルド効率化TIPS
All contents copyright © 2005-2018 Shoeisha Co., Ltd. All rights reserved. ver.1.5