MSBuild

Last-modified: 2016-03-18 (金) 12:05:45

TIPS

  • GACにインストールされていないアセンブリをインラインタスクから利用するには、リフレクションを使って動的にロードするしかない模様

以下のケースだとMSBuildの動作が異様に遅くなる。TARGET_FOLDERに適切なフォルダのパスを記述すると改善する。*1

<PropertyGroup>
  <TARGET_FOLDER></TARGET_FOLDER>
</PropertyGroup>
<ItemGroup>
  <TARGET_FILES Include="$(TARGET_FOLDER)\**\*.*" />
</ItemGroup>

次のように記述するとTARGET_FOLDERが空でも問題ない。

<PropertyGroup>
  <TARGET_FOLDER></TARGET_FOLDER>
</PropertyGroup>
<Choose>
  <When Condition="'$(TARGET_FOLDER)'!='' And Exists('$(TARGET_FOLDER)\.')">
    <ItemGroup>
      <TARGET_FILES Include="$(TARGET_FOLDER)\**\*.*" />
    </ItemGroup>
  </When>
</Choose>

カスタムタスク

片手間で作ったMSBuild用カスタムタスク。要.NET Framework 4.0以降。なお、吉里吉里2/KAG3用カスタムタスクはMSBuildで定型作業を自動化を参照のこと。

InnoSetup5Taskリファレンス

Inno Setup 5のコマンドラインコンパイラを起動するカスタムタスク。

ISCCタスク

Inno Setupコンパイラ(ISCC.exe)を実行し、Inno Setupスクリプト(.iss)をコンパイルする。

属性読込書込説明備考
ScriptFileString×指定必須。Inno Setupスクリプト(.iss)名を指定する
OutputDirString×インストーラの出力先フォルダ名を指定する
OutputBaseFilenameString×インストーラのファイル名(拡張子なし)を指定する
QuietBoolean×True指定時、サイレントモードでコンパイルする省略時はFalse
IsppOptionsString×ISPP拡張オプションを指定する
WorkingDirectoryString×コマンドを実行するフォルダを指定する
ExitCodeInt32×ISCCタスクの出力パラメータとして、ISCC.exeの終了コードを返す
  • OutputDirを指定すると、Inno Setupスクリプト(.iss)中のOutputDirの値を無視する
  • OutputBaseFilenameを指定すると、Inno Setupスクリプト(.iss)中のOutputBaseFilenameの値を無視する
  • /Sオプションには対応していない

プロパティIS5_HOME、環境変数IS5_HOME

InnoSetup5Task.dllが実行するISCC.exeは以下の順番で決まる:

  1. Inno Setup 5がデフォルトのフォルダにインストールされている場合、%ProgramFiles%\Inno Setup 5\ISCC.exeを実行する
  2. プロパティIS5_HOMEが設定されている場合、$(IS5_HOME)\ISCC.exeを実行する
  3. 環境変数IS5_HOMEが設定されている場合、%IS5_HOME%\ISCC.exeを実行する
  4. どちらも設定されていない場合、環境変数PATHの設定に従ってISCC.exeを実行する

ここでIS5_HOMEとはInno Setup 5のインストール先フォルダを示す。

使用例

以下のXMLファイル(ファイル名はis5task.proj)を例に説明する。プロパティの値(IS5TASK_FOLDER~SCRIPT_FILE)は各自の環境に合わせて修正のこと。

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!-- プロパティの設定(この値を変更してください) -->
  <PropertyGroup>
    <!-- InnoSetup5Task.dllのあるフォルダ -->
    <IS5TASK_FOLDER>C:\CustomTask</IS5TASK_FOLDER>
    <!-- Inno Setupスクリプト(.iss) -->
    <SCRIPT_FILE>C:\InnoSetup\setup.iss</SCRIPT_FILE>
  </PropertyGroup>
  <!-- 使用するアセンブリとタスク名を宣言 -->
  <UsingTask AssemblyFile="$(IS5TASK_FOLDER)\InnoSetup5Task.dll" TaskName="ISCC" />
  <!-- Buildターゲット -->
  <Target Name="Build">
    <!-- コンパイル -->
    <ISCC ScriptFile="$(SCRIPT_FILE)">
      <Output TaskParameter="ExitCode" PropertyName="EXIT_CODE" />
    </ISCC>
    <Message Text="ExitCode = $(EXIT_CODE)" />
  </Target>
</Project>

コマンドプロンプトを起動し、以下のコマンドラインを実行すれば、コンパイルが行われる。

msbuild is5task.proj

ダウンロード

圧縮アーカイブファイルには、以下のファイルが含まれている。

  • InnoSetup5Task.dll … Inno Setup 5用MSBuildカスタムタスク
  • InnoSetup5Task フォルダ以下 … InnoSetup5Task.dll のソースファイル(Visual C# .NET / SharpDevelop 4.2.2)

動作環境

  • Windows XP SP3 / Windows Vista SP2
  • .NET Framework 4
  • Inno Setup 5.5.2

ImageMagick6Taskリファレンス

ImageMagick 6のコンソールコマンドを起動するだけのカスタムタスク。*2ImageMagickImageMagickを使った画像処理のトピックも参照。

タスクにはCompare、Composite、Conjure、Convert、Identify、Mogrify、Montageがあり、以下の共通の属性を持つ。

属性読込書込説明
ParameterString×コマンドライン引数を指定する
WorkingDirectoryString×コマンドを実行するフォルダを指定する
  • Parameter属性でダブルクォーテーションやパーセントを記述する場合、CDATAセクション中に記述するか、エスケープする必要がある。詳細はMSBuild の特殊文字を参照

使用例

<?xml version="1.0" encoding="utf-8"?>
<!--
  サムネイル画像作成、画像連結、文字描画のサンプル
  $(SOURCE_FOLDER)内に紹介シナリオの背景画像ファイル(_24.jpg~_24_5.jpg)があるという前提で書いてある
-->
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ImportGroup>
    <Import Project="$(MSBuildProjectDirectory)\ImageMagick6Task.Targets" />
  </ImportGroup>
  <PropertyGroup>
    <SOURCE_FOLDER>$(MSBuildProjectDirectory)\input</SOURCE_FOLDER>
    <DESTINATION_FOLDER>$(MSBuildProjectDirectory)\output</DESTINATION_FOLDER>
    <MSL_FILE>$(MSBuildProjectDirectory)\thumbnail2.msl</MSL_FILE>
    <THUMBNAIL_SIZE>160x120</THUMBNAIL_SIZE>
    <THUMBNAIL_PERCENT>20</THUMBNAIL_PERCENT>
    <THUMBNAIL_PERCENT2>30</THUMBNAIL_PERCENT2>
    <POSITION>south</POSITION>
    <FONTFACE>$(WINDIR)\fonts\msgoth90.ttc</FONTFACE>
    <FONTSIZE>25</FONTSIZE>
    <ANGLE>0</ANGLE>
    <LEFT>+0</LEFT>
    <TOP>+11</TOP>
    <FILLCOLOR>white</FILLCOLOR>
    <TEXT>画面は開発中のものです</TEXT>
  </PropertyGroup>
  <ItemGroup>
    <SOURCE_IMAGES Include="$(SOURCE_FOLDER)\**\*.*" />
    <BUTTON_NAME Include="Button1">
      <LEFT>_24.jpg</LEFT>
      <CENTER>_24_2.jpg</CENTER>
      <RIGHT>_24_4.jpg</RIGHT>
    </BUTTON_NAME>
    <BUTTON_NAME Include="Button2">
      <LEFT>_24.jpg</LEFT>
      <CENTER>_24_3.jpg</CENTER>
      <RIGHT>_24_5.jpg</RIGHT>
    </BUTTON_NAME>
  </ItemGroup>
  <Target Name="Thumbnail1">
    <Convert Parameter="-resize $(THUMBNAIL_SIZE) %22%(Identity)%22 %22@(SOURCE_IMAGES->'$(DESTINATION_FOLDER)\%(Filename)_s1.png')%22" />
  </Target>
  <Target Name="Thumbnail2">
    <Convert Parameter="-resize %22$(THUMBNAIL_PERCENT)%25%22 %22%(Identity)%22 %22@(SOURCE_IMAGES->'$(DESTINATION_FOLDER)\%(Filename)_s2.png')%22" />
  </Target>
  <Target Name="Connect">
    <MakeDir Directories="$(DESTINATION_FOLDER)" />
    <Montage Parameter="-background transparent -geometry +0+0 -tile 3x1 %22$(SOURCE_FOLDER)\%(LEFT)%22 %22$(SOURCE_FOLDER)\%(CENTER)%22 %22$(SOURCE_FOLDER)\%(RIGHT)%22 %22$(DESTINATION_FOLDER)\@(BUTTON_NAME).png%22" />
  </Target>
  <Target Name="DrawText">
    <Convert Parameter="%22%(Identity)%22 -fill #0007 -draw %22rectangle 10,440,630,470%22 -gravity $(POSITION) -font %22$(FONTFACE)%22 -fill $(FILLCOLOR) -pointsize $(FONTSIZE) -annotate $(LEFT)$(TOP) %22$(TEXT)%22 %22@(SOURCE_IMAGES->'$(DESTINATION_FOLDER)\%(Filename)_e.png')%22" />
  </Target>
  <Target Name="Script">
    <Conjure Parameter=" -SOURCE %22%(Identity)%22 -PERCENTAGE $(THUMBNAIL_PERCENT2) -DESTINATION %22@(SOURCE_IMAGES->'$(DESTINATION_FOLDER)\%(Filename)_s3.png')%22 %22$(MSL_FILE)%22" />
  </Target>
  <Target Name="Build">
    <MakeDir Directories="$(DESTINATION_FOLDER)" />
    <CallTarget Targets="Thumbnail1;Thumbnail2;Connect;DrawText;Script" />
  </Target>
</Project>

ダウンロード

圧縮アーカイブファイルには、以下のファイルが含まれている。

  • ImageMagick6Task.dll … ImageMagick 6用MSBuildカスタムタスク
  • ImageMagick6Task.Targets
  • sample.proj … サンプルのMSBuildプロジェクトファイル
  • thumbnail2.msl … ↑から呼び出されるMSLファイル
  • source フォルダ以下 … ImageMagick6Task.dll のソースファイル(Visual C# .NET / SharpDevelop 4.2.1)

動作環境

  • Windows XP SP3 / Windows Vista SP2
  • .NET Framework 4
  • ImageMagick 6.7.9-0 Q16

SMail4Task.Targetsリファレンス

SMAILを起動するカスタムタスク。

SMailタスク

SMAILでメールを送信する。

属性読込書込説明備考
AttachmentsITaskItem[]×添付ファイルのパス一覧を指定する
DebugBoolean×True指定時、デバッグ表示モードで実行する省略時はFalse
FileString×メール本文を記述したテキストファイルのパスを指定する文字コードはShift JISであること
FromString×送信元メールアドレスを指定する
InformationBoolean×True指定時、インフォメーション表示モードで実行する省略時はFalse
MessageIdString×Message-IDを指定する"auto"と指定すれば自動的に値が振られる
NtTzAdjustmentBoolean×True指定時、NTタイムゾーン調整を行う省略時はFalse
PriorityInt32×プライオリティを 1 (重要度高)~ 9 (重要度低)の範囲の値で指定する
ReplyToString×返信先メールアドレスを指定する"auto"と指定すればMailFromの値が使われる
ServerString×指定必須。メールサーバ名またはIPアドレスを指定する
SilentBoolean×True指定時、サイレントモード(エラー出力しない)で実行する省略時はFalse
SslBoolean×True指定時、SSLでTLSを使用する(False時はSSLv2v3を使用)省略時はFalse
StartTlsBoolean×True指定時、STARTTLSでSSLを開始する省略時はFalse
SubjectString×サブジェクトを指定する
TextString×メール本文を指定する
ToString×指定必須。送信先メールアドレスを指定する
WorkingDirectoryString×コマンドを実行するフォルダを指定する
  • Fromは"Nickname <MailAddress>"形式で指定しても良い(CDATAセクション中に記述する)。なおReplyToではこの形式は使えない
    • CDATAセクションを使わない場合、 < は %3C 、> は %3E にエスケープすること

ReplaceTextタスク

同報メール用メッセージを作成するインラインタスク。

属性読込書込説明備考
DepartmentsITaskItem[]×送信相手の所属部署などを指定するこの属性を指定する場合、アイテム数はNamesのアイテム数と同じであること
EncodingString×Fileの文字コードを指定する省略時はshift_jis
FileString×メール本文が記述されたテキストファイルのパスを指定するTextを指定しない場合は必須
NamesITaskItem[]×指定必須。送信相手の名前(姓+役職など)を指定する
TextString×メール本文を指定するFileを指定しない場合は必須
ValuesITaskItem[]×タスクの出力値Namesが持つカスタムメタデータもコピーされる
  • Fileから読み込んだ文字列、またはTextを次のルールで置換する
    • 文字列中の全ての {Name} をNames属性値に置換する
    • 文字列中の全ての {Department} をDepartments属性値に置換する

サンプル

<?xml version="1.0" encoding="UTF-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!--SMail4Task.Targetsをインポート-->
  <Import Project="$(MSBuildProjectDirectory)\SMail4Task.Targets" />
  <PropertyGroup>
    <MAIL_SERVER>mailhost</MAIL_SERVER>
    <FROM><![CDATA[PIYO <piyo@hoge.co.jp>]]></FROM>
    <SUBJECT>同報メール配信のテスト</SUBJECT>
    <MESSAGE>
<![CDATA[サークル {Department}
{Name} 様
同報メール配信のテストです。]]>
    </MESSAGE>
  </PropertyGroup>
  <ItemGroup>
    <NAMES Include="foo">
      <NUMBER>1</NUMBER>
    </NAMES>
    <NAMES Include="bar">
      <NUMBER>2</NUMBER>
    </NAMES>
    <MAILS Include="foo@hoge.co.jp">
      <NUMBER>1</NUMBER>
    </MAILS>
    <MAILS Include="bar@hoge.co.jp">
      <NUMBER>2</NUMBER>
    </MAILS>
    <DEPARTMENTS Include="baz">
      <NUMBER>1</NUMBER>
    </DEPARTMENTS>
    <DEPARTMENTS Include="qux">
      <NUMBER>2</NUMBER>
    </DEPARTMENTS>
  </ItemGroup>
  <Target Name="Build">
    <ReplaceText Text="$(MESSAGE)" Names="@(NAMES)" Departments="@(DEPARTMENTS)" >
      <Output TaskParameter="Values" ItemName="BROADCAST_MESSAGES" />
    </ReplaceText>
    <SMail Server="$(MAIL_SERVER)" From="$(FROM)" To="@(MAILS)" Subject="$(SUBJECT)" Text="@(BROADCAST_MESSAGES)" Condition="%(NUMBER) &gt; 0" />
  </Target>
</Project>

ダウンロード

動作環境

  • Windows XP SP3 / Windows Vista SP2
  • .NET Framework 4
  • SMAIL 4.13

*1 記述通り、ルートフォルダ以下を検索しまくるためだろう。
*2 conjureの補完が主目的だが、MSLファイルを書くより、convertで直接指定するほうが手っ取り早いのが何とも…。