NAntを.NET 3.5に対応させる

.NET 3.5もリリースされたので、VisualC# 2008 Expressをダウンロードして、そろそろ本格的に使う準備を始めようとしているわけだけど、その中でも今使っている各種フレームワークを対応させていくという作業が必要になってくる。

Spring.NETとかNUnitNAntなんかは開発に必須なので早急に対応させる必要がある。Spring.NETやNUnitは開発が活発だし、それにその性質上バージョンはあまり関係ない。しかしNAntはバージョンにすごく関係があるのに開発がほとんど止まっている状況なので.NET 3.5への対応はあまり期待できない。

じゃあ自分で対応させるかということでNAnt0.85のソースをダウンロードしてきて、調べる事にした。ざっと見た感じどうやらソースを変更させる必要はなく、NAnt.exeのアプリケーション構成ファイルに.NET 3.5用の設定を追加するだけでできそう。

変更箇所

NAnt.exe.configファイルに以下の設定を追加。

<framework 
    name="net-3.5"
    family="net"
    version="3.5"
    description="Microsoft .NET Framework 3.5"
    runtimeengine=""
    sdkdirectory="${path::combine(sdkInstallRoot, 'bin')}"
    frameworkdirectory="${path::combine(installRoot, 'v3.5')}"
    frameworkassemblydirectory="${path::combine(installRoot, 'v2.0.50727')}"
    clrversion="2.0.50727"
    >
    <task-assemblies>
        <!-- include .NET specific assemblies -->
        <include name="tasks/net/*.dll" />
        <!-- include .NET 2.0 specific assemblies -->
        <include name="tasks/net/2.0/**/*.dll" />
        <!-- include Microsoft.NET specific task assembly -->
        <include name="NAnt.MSNetTasks.dll" />
        <!-- include Microsoft.NET specific test assembly -->
        <include name="NAnt.MSNet.Tests.dll" />
    </task-assemblies>
    <project>
        <readregistry
            property="installRoot"
            key="SOFTWARE\Microsoft\.NETFramework\InstallRoot"
            hive="LocalMachine" />
        <readregistry
            property="sdkInstallRoot"
            key="SOFTWARE\Microsoft\.NETFramework\sdkInstallRootv2.0"
            hive="LocalMachine"
            failonerror="false" />
    </project>
    <tasks>
        <task name="csc">
            <attribute name="exename">csc</attribute>
            <attribute name="supportsnowarnlist">true</attribute>
            <attribute name="supportswarnaserrorlist">true</attribute>
            <attribute name="supportskeycontainer">true</attribute>
            <attribute name="supportskeyfile">true</attribute>
            <attribute name="supportsplatform">true</attribute>
            <attribute name="supportslangversion">true</attribute>
        </task>
        <task name="vbc">
            <attribute name="exename">vbc</attribute>
            <attribute name="supportsdocgeneration">true</attribute>
            <attribute name="supportsnostdlib">true</attribute>
            <attribute name="supportsnowarnlist">true</attribute>
            <attribute name="supportskeycontainer">true</attribute>
            <attribute name="supportskeyfile">true</attribute>
            <attribute name="supportsplatform">true</attribute>
            <attribute name="supportswarnaserrorlist">true</attribute>
        </task>
        <task name="jsc">
            <attribute name="exename">jsc</attribute>
            <attribute name="supportsplatform">true</attribute>
        </task>
        <task name="vjc">
            <attribute name="exename">vjc</attribute>
            <attribute name="supportsnowarnlist">true</attribute>
            <attribute name="supportskeycontainer">true</attribute>
            <attribute name="supportskeyfile">true</attribute>
        </task>
        <task name="resgen">
            <attribute name="exename">resgen</attribute>
            <attribute name="supportsassemblyreferences">true</attribute>
            <attribute name="supportsexternalfilereferences">true</attribute>
        </task>
        <task name="al">
            <attribute name="exename">al</attribute>
        </task>
        <task name="delay-sign">
            <attribute name="exename">sn</attribute>
        </task>
        <task name="license">
            <attribute name="exename">lc</attribute>
            <attribute name="supportsassemblyreferences">true</attribute>
        </task>
        <task name="ilasm">
            <attribute name="exename">ilasm</attribute>
        </task>
        <task name="ildasm">
            <attribute name="exename">ildasm</attribute>
        </task>
    </tasks>
</framework>

ほとんど変更箇所はなくて、「name」「version」「description」を書き換えて、「frameworkdirectory」を.NET3.5のインストールディレクトリのパスに変更する。「frameworkassemblydirectory」は.NET 3.5は追加のライブラリとコンパイラが新しくなっているだけなので、大部分は.NET 2.0と同じ設定でいける。「clrversion」も変更なし。
「project」->「readregistry」要素の「sdkInstallRoot」は変更する必要がありそうだけど、現状では.NET 3.5 SDKが入手できなくてパスがわからないので放置しておく。あとは変更なし。

「HogeLibrary.2008.csproj」というファイル名のVS2008プロジェクトを作成して、以下のビルドファイルを用意する。

<?xml version="1.0" encoding="shift-jis" ?>
<project xmlns="http://nant.sf.net/release/0.85/nant.xsd" 
    name="HogeLibrary" default="build" basedir="../src/HogeLibrary">

    <!-- プロジェクトの名前 -->
    <property name="project.name" value="${project::get-name()}" />    
    <!-- ソースディレクトリ -->
    <property name="src.dir" value="./" />

    <!-- MSBuildツールのパス(VS2008用) -->
    <property name="msbuild"
        value="${environment::get-variable('windir')}\Microsoft.NET\Framework\v3.5\MSBuild.exe" />

    <target name="build" description="ソースをビルドします">
        <exec program="${msbuild}"
            commandline="/p:Configuration=${configuration} ${src.dir}${project.name}.2008.csproj" />
    </target>

</project>

あとはコマンドラインから以下のコマンドを実行する。

PS > nant /t:net-3.5 /f:ビルドファイル名

これで.NET 3.5に対応できたというか、VS2008に対応できたと思う。