初めてのMSBuild

マイクロソフトの新しいBuildエンジン。バージョンアップのたびにプロジェクトファイルを変更してくれていますが、今度こそは決定版となって貰いたいです。さて、MSBuildの記述方法ですが、今どきのツールっぽく、やっぱりXML形式です。NAntとか使っているとお馴染みですね。まずは、Hello.csをビルドしてHello.exeを作るプロジェクトファイル。

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="Build" Outputs="Hello.exe">
    <Csc Sources="@(CSFiles)" References="@(References)" >
  </Target>
  <ItemGroup>
    <CSFiles Include="*.cs" >
    <References Include= "System.dll" >
  </ItemGroup>
</Project>

プロジェクトファイルのファイル名は、拡張子の最後がprojで終わるようにしておくと、MSBuildから自動的に呼び出されるようになります。.csprojとか.vbprojでもOKです。で、プロジェクトファイルがあるディレクトリでmsbuildコマンドを実行すると、

> Csc.exe /reference:System.dll /out:Hello.exe Hello.cs

が、実行され、Hello.exeが作成されます。ちなみにプロジェクトファイルに記述されている、CscタグはMSBuildに組み込まれているタスクの1つで、他にもVBコンパイラを呼び出すVbcやCopy、MakeDirと言ったタスクもあります。また、MSBuildでは組み込みタスクの他にも自前のカスタムタスクを作ることが出来ます。簡単な自作タスクの例。

using System;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;

public class HelloTask : Task {
    string name;
    public string Name {
        get { return name; }
        set { name = value; }
    }

    public override bool Execute() {
        Console.WriteLine("Hello, " + name);
        return true;
    }
}

このように、Taskクラスから継承してExecuteをオーバーライドします。で、これをビルドします。

>csc /t:library /r:Microsoft.Build.Framework.dll,Microsoft.Build.Utilities.dll MyTasks.cs

これで、HelloTaskが作成されました。では、これをMSBuildから呼び出してみます。

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="MyTarget">
    <HelloTask Name="mei" >
  </Target>
  <UsingTask TaskName="HelloTask" AssemblyFile="MyTasks.dll" >
</Project>

このようにUsingTask内でタスク名とアセンブリを指定することで、タスクとして呼び出せるようになります。で、このタスクを実行すると、

プロジェクト "hello.proj" 内のターゲット "MyTarget" です。
   タスク "HelloTask"
Hello, mei

呼び出せていることが分かりますね。