可能かどうかはわかりませんが、T4スクリプトを別のプロジェクトに配置し、MSBuildタスクを使用して生成されたファイルをEFエンティティプロジェクトにコピーすることはできます。
ソリューションには次のものが含まれている必要があります
- あなたのEFエンティティプロジェクト、それをエンティティと呼びましょう
- エンティティジェネレータプロジェクト(ここにT4スクリプトを配置します)。たとえば、 EntitiesGeneratorと呼びます。
また、生成されたC#ファイルを「エンティティ」プロジェクトにコピーするカスタムMSBuildタスク用のプロジェクトを作成する必要があります。
これを行うには、クラスライブラリプロジェクトMyBuildProcessを作成します
次のアセンブリを参照してください。
- Microsoft.Build.Framework(C:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319にあります)
それでは、カスタムタスクを作成しましょう。たとえば、プロジェクトにクラスファイルを追加します。CopyGeneratedEntities.cs
using System;
using Microsoft.Build.Framework;
using System.IO;
namespace MyBuildProcess
{
public class CopyGeneratedEntities : ITask
{
private IBuildEngine _buildEngine;
public IBuildEngine BuildEngine
{
get { return _buildEngine; }
set { _buildEngine = value; }
}
private ITaskHost _hostObject;
public ITaskHost HostObject
{
get { return _hostObject; }
set { _hostObject = value; }
}
public bool Execute()
{
// Copy generated Product entity to EF project
if (File.Exists(@"C:\MySolution\EntitiesGenerator\ProductEntity.cs"))
{
File.Copy(@"C:\MySolution\EntitiesGenerator\ProductEntity.cs",
@"C:\MySolution\Entities\ProductEntity.cs", true);
}
return true;
}
}
}
プロジェクトを構築する
次に、T4プロジェクト(EntitiesGenerator )に対応する.csprojファイルを編集し、タグのすぐ下に次を追加してカスタムタスクを参照します。<Project ... >
<UsingTask AssemblyFile="C:\MySolution\Libs\MyBuildProcess.dll"
TaskName="MyBuildProcess.CopyGeneratedEntities" />
そして、このようにタスクを呼び出します(csprojファイルの最後の</Project>
):
<Target Name="AfterBuild">`
<CopyGeneratedEntities />
</Target>
これで、 EntitiesGeneratorプロジェクトをビルドすると、T4がエンティティをレンダリングし、ビルドが完了すると、カスタムタスクが呼び出され、ファイルが「エンティティ」プロジェクトにコピーされます。
生成されたC#ファイルを最初の生成後にエンティティプロジェクトに手動で参照するだけで、それらは単に上書きされます。
MSBuildの詳細については、を参照してください。
MSBuildチームブログ-方法:カスタムタスクの実装
Microsoft.Build名前空間