Share via


ビルド処理でのコード生成

Visual Studio ソリューションのビルド処理の一環として、テキスト変換を呼び出すことができます。 テキスト変換を呼び出すことで、テンプレートから生成されたファイルをコンパイルする前に、そのファイルが最新の状態であることを確認できます。 そのため、ユーザーがプロジェクトのビルドまたはコードのチェックインを実行する前に、[すべてのテンプレートの変換] をクリックするのを忘れるという状況を回避できます。 テキスト変換タスクは、ビルド サーバー上で Visual Studio または MSBuild によって実行できます。

プロジェクト ファイルにテキスト変換タスクを含める

Visualization and Modeling SDK のインストール

開発コンピューターでビルド タスクを有効にするには、Visual Studio Visualization and Modeling SDK をインストールします。

ビルド サーバーでビルド タスクを有効にするには、「ビルド サーバーでのテキスト変換」を参照してください。

プロジェクト ファイルの編集

テキスト変換を呼び出すには、プロジェクトの定義ファイルを編集する必要があります。 これらのプロパティは、プロジェクトのプロパティ エディターで編集することはできません。 したがって、プロジェクトを閉じてから、テキスト ファイルとして編集する必要があります。

プロジェクト ファイルのテキストを編集するには

  1. ソリューション エクスプローラーでプロジェクトを右クリックし、[プロジェクトのアンロード] をクリックします。

  2. プロジェクトを再度右クリックし、[<プロジェクト> の編集] をクリックします。

    プロジェクト ファイルのテキストが XML エディターに表示されます。

編集後にプロジェクトを再度開くには

  1. XML エディターを閉じます。

  2. ソリューション エクスプローラーでプロジェクトを右クリックし、[プロジェクトの再読み込み] をクリックします。

テキスト変換ターゲットのインポート

テキスト変換ビルド タスクは、単一のファイルで定義されます。 これは、標準の C# または Visual Basic のターゲットの後にインポートする必要があります。

テキスト変換ターゲットをインポートするには

  1. 次のいずれかと同様の行をファイルから探します。

    <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

    または

    <Import Project="$(MSBuildToolsPath)\Microsoft.VisualBasic.targets" />

  2. この行の後に、テキスト テンプレートのインポートを挿入します。

    <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\TextTemplating\v10.0\Microsoft.TextTemplating.targets" />

ビルドの実行方法を制御するためのプロパティの設定

次のテキストをプロジェクト ファイルに挿入します。 このプロパティ グループに挿入できる他のプロパティについては、以降の各セクションを参照してください。

<PropertyGroup>
 <TransformOnBuild>true</TransformOnBuild>
 <!-- Other properties can be inserted here -->
</PropertyGroup>

TransformOnBuild によって、プロジェクトのビルド時にプロジェクト内のすべてのテンプレートが実行されます。

変換の呼び出し

プロジェクト ビルド時のすべてのテンプレートの変換

プロジェクト ファイルに次のプロパティを含めた場合、プロジェクト内のすべてのテキスト テンプレートが、そのプロジェクトをビルドするたびに実行され、インクリメンタル ビルド機能の適用対象になります。

<TransformOnBuild>true</TransformOnBuild>

変換は、Visual Studio で F5 キーを押すか、MSBuild を使用して呼び出すことができます。 次に例を示します。

msbuild myproject.csproj

TransformOnBuild を省略するか false に設定した場合、プロジェクトをビルドする過程でのテンプレートの自動変換は無効になります。

参照パスの追加

テンプレートで参照されているアセンブリを検索するためにホストが参照する一連のパスを追加することができます。 次に例を示します。

<ItemGroup>
    <!-- Add VS\...\PublicAssemblies to the list of places
         to look for assemblies used by templates. -->
    <T4ReferencePath Include="$(VsIdePath)PublicAssemblies\" />
</ItemGroup>

特定のテンプレートの変換

特定のファイルを変換するには、msbuild ユーティリティで Transform タスクを呼び出します。 このタスクは TransformOnBuild プロパティには依存せず、また、プロジェクト ファイルのコンパイルを行いません。 前のセクションで説明したように、テキスト テンプレート ターゲット ファイルをインポートする必要があります。

たとえば、特定のファイルを変換するには、次のようにします。

msbuild myproj.proj /t:Transform /p:TransformFile=MyTemplate.tt

TransformFile パラメーターにはワイルドカード文字を使用することもできます。 たとえば、このコマンドを実行すると、GeneratedCode フォルダー内のすべての .tt ファイルが変換されます。

msbuild dsl.csproj /t:Transform /p:TransformFile="GeneratedCode\**\*.tt"

インクリメンタル ビルド

出力ファイルが最新である場合、既定では、ビルド マネージャーがテンプレートの実行を回避します。 具体的には、ファイル システムを監視して、テンプレート コードによって読み取られたファイルを確認します。 それ以降は、これらのファイルの変更日を、出力ファイルの日付と比較します。 更新日が出力ファイルよりも新しいファイルが入力ファイルの中に 1 つでも存在した場合は、テンプレートが実行されます。 対応するテンプレートに関して以前の実行に関する情報がまったくない場合にも、テンプレートが実行されます。

まとめると、次のいずれかのファイルよりも出力ファイルの方が古い場合、その出力ファイルは再生成されます。

  • テキスト テンプレート ファイル

  • <#@include#> ディレクティブで指定されたファイル

  • テンプレート内のコードによって読み取られるファイル

  • テンプレートに使用されているディレクティブ プロセッサによってインクルードされる (または読み取られる) ファイル

ビルドを実行するたびにすべてのテンプレートが実行されるようにするには、次のプロパティを挿入します。

<TransformOutOfDateOnly>false</TransformOutOfDateOnly>

ソース管理

ソース管理システムと連携するような専用の機能は組み込まれていません。 ただし、生成されたファイルをチェックインしたりチェックアウトしたりするための独自の拡張機能を追加することはできます。

既定では、テキスト変換タスクは、読み取り専用としてマークされたファイルを上書きしません。そのようなファイルが見つかった場合は、Visual Studio のエラー一覧にエラーが記録され、タスクは失敗します。

読み取り専用ファイルを上書きするには、次のプロパティを挿入します。

<OverwriteReadOnlyOuputFiles>true</OverwriteReadOnlyOuputFiles>

後処理のステップをカスタマイズしない限り、ファイルが上書きされるとエラー一覧に警告が記録されます。

ビルド処理のカスタマイズ

上書きしたファイルをチェックアウトするなど、ビルド処理はカスタマイズすることができます。 用意されているカスタマイズ ポイントは 2 か所で、変換の前後に呼び出されます。

これらのポイントを定義するには、$(BeforeTransform) プロパティと $(AfterTransform) プロパティを定義します。

次に例を示します。

<PropertyGroup>
    <BeforeTransform>CustomPreTransform</BeforeTransform>
    <AfterTransform>CustomPostTransform;$(AfterTransform)</AfterTransform>
  </PropertyGroup>
  <Target Name="CustomPreTransform">
    <Message Text="In CustomPreTransform..." Importance="High" />
  </Target>
  <Target Name="CustomPostTransform">
    <Message Text="In CustomPostTransform..." Importance="High" />
  </Target>

AfterTransform では、次のリストを参照できます。

  • GeneratedFiles: 処理中に出力されたファイルのリスト。 既存の読み取り専用ファイルを上書きしたファイルについては、%(GeneratedFiles.ReadOnlyFileOverwritten) が true になります。 これらのファイルは、ソース管理からチェックアウトできます。

  • NonGeneratedFiles: 上書きされなかった読み取り専用ファイルのリスト。

これらのリストを使用すると、たとえば、上書きされたファイルをチェックアウトできます。

ビルド サーバーでのテキスト変換

Visual Studio がインストールされていないコンピューターでビルド サーバーが実行されている場合は、Visual Studio SDK がインストールされているコンピューターから、次のファイルをビルド コンピューターにコピーする必要があります。

  • \Program Files\Microsoft Visual Studio 2010 SDK\VisualStudioIntegration\Common\Assemblies\v4.0\

    • Microsoft.VisualStudio.TextTemplating.10.0.dll

    • Microsoft.VisualStudio.TextTemplating.Interfaces.10.0.dll

    • Microsoft.VisualStudio.TextTemplating.VSHost.10.0.dll

  • \Program Files\MSBuild\Microsoft\VisualStudio\TextTemplating\v10.0\

    • Microsoft.VisualStudio.TextTemplating.Sdk.Host.10.0.dll
  • \Program Files\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies\

    • Microsoft.VisualStudio.TextTemplating.Modeling.10.0.dll

詳細については、「ビルド コントローラーの作成と使用」を参照してください。

参照

その他の技術情報

Visual Studio Visualization and Modeling SDK