わんくま同盟 大阪勉強会 #42 で、MSBuild について話しました

勉強会自体は、なか日記 がきれいにまとめてくれています。

セッション資料はこちら:Ms build 色々出来るよ
簡単ですが、プロジェクトファイル(.proj) 、タスク、ターゲットの紹介をしました。カスタムタスクの紹介では、Twitter に投稿するタスクを作成しました。
※今回はサンプルなので、AOuth の認証は別に済ましています。

Twitter.cs

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

namespace MSBuildTwitterTask
{
  public class Twitter : Task
  {
    public string ConsumerKey { get; set; }
    public string ConsumerSecret { get; set; }
    public string AccessToke { get; set; }
    public string OAuthToken { get; set; }
    public string Message { get; set; }
    public ITaskItem[] Mentions { get; set; }
    public override bool Execute()
    {
      var auth = new PinAuthorizer
      {
        Credentials = new InMemoryCredentials
        {
          ConsumerKey = ConsumerKey ?? "〜", 
          ConsumerSecret = ConsumerSecret ?? "〜", 
          AccessToken = AccessToke ?? "〜", 
          OAuthToken = OAuthToken ?? "〜"
        },
        UseCompression = true,
      };
      auth.Authorize();

      using (var ctx = new TwitterContext(auth, "https://api.twitter.com/1/", "https://search.twitter.com/"))
      {
        //Log
        ctx.Log = Console.Out;
        String msg = "";
        foreach (ITaskItem recipient in this.Mentions)
        {
          msg += recipient.ItemSpec + " ";
        }
        ctx.UpdateStatus(msg + (Message ?? "Tweet Task"));
      }

      return true;
    }
  }
}

Twitter タスクを呼び出す プロジェクトファイル(.csproj)

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Default" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  〜 長いので省略
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <UsingTask AssemblyFile="dll\MSBuildTwitterTask.dll" TaskName="Twitter" />
  <ItemGroup>
    <!-- Mentions -->
    <Mention Include="@shinsukeoda"/>
    <Mention Include="@msbuildtesttest"/>
  </ItemGroup>
  <Target Name="Default">
    <CallTarget Targets="Build" />
    <Twitter Mentions="@(Mention) Message="成功"/>
    <OnError ExecuteTargets="Error" />
  </Target>
  <Target Name="Error">
    <Twitter Mentions="@(Mention) Messge="失敗"/>
  </Target>
</Project>

今回、時間が押していたのと若干テンパっていたため、伝えたかった事をさらっと流してしまったのが失敗。。
次のようなこともまとめて MSBuild でしてしまおうというのが、伝えたかったことでした。

・ソース管理から最新ファイルを取得
・ビルド
・テスト/レポートの作成
・必要なファイルを ZIP 圧縮

Ship It! に、初日にビルドスクリプトを作成しようみたいな事が書かれていたと思います。
Ship It! ソフトウェアプロジェクト 成功のための達人式ガイドブック
.NET での開発でもそれにならって、リリース用のプロジェクトファイルや、レポート用のプロジェクトファイルを別に作成してみるのも良いかもしれませんね!