3

EF アプリケーションでエンティティの部分クラスを生成する一連の T4 スクリプトを使用しています。

部分クラスは同じアセンブリに存在する必要があるため、スクリプトはエンティティ クラスと同じプロジェクトに存在します。また、実行時にコンパイル済みアセンブリへのアクセスも必要です。

エラーが発生すると、スクリプトは「ErrorGeneratingOutput」という出力で失敗します。生成されたファイルは (その時点で) 無効なコンテンツを含む .cs ファイルであるため、これによりプロジェクト全体がコンパイルされなくなります。

これは、生成されたファイルからエラー メッセージを手動で削除し、ビルドをトリガーする場合にのみ、依存関係の悪循環を断ち切ることができます。

エラー メッセージを非表示にする (または空の文字列に置き換える) 方法があれば、私の人生はずっと楽になります。

問題は、t4 スクリプトのエラー処理を変更できますか?

4

2 に答える 2

3

場合によっては、この問題は簡単に解決できます。

私の場合、問題は T4 スクリプトが存在するプロジェクトの DLL の読み込みに関するものでした。アセンブリ ディレクティブは、スクリプトの先頭領域 (5 行目) に配置されました。そこで、出力拡張子をtxtに変更しました。

<#@ template language="C#" hostspecific="True" debug="True" #>
<#@ output extension="txt" #>
<#@assembly name="invalidAssemblyName"#>

次に、EntityFrameworkFileManager を使用して、実際の出力を別のファイルに配置しました。

<#@ include file="EF.Utility.CS.ttinclude"#>
<#
var fileManager = EntityFrameworkTemplateFileManager.Create(this);
fileManager.StartHeader();
fileManager.StartNewFile("Output.cs");
#>
//content
<#
fileManager.Process();
#>

アセンブリを読み込めないというエラーが発生した場合、ErrorGeneratingOutput メッセージが既定の .txt ファイルに出力されます。これにより、コンパイルの問題は発生しません。アセンブリを読み込むことができる場合、出力は Output.cs ファイルに出力されます。

このようにして、最初の問題を修復した後にプロジェクトをビルドすることができ、開発者は ErrorGeneratingOutput の問題についても気にする必要がありません。

于 2012-07-02T14:54:50.180 に答える
2

可能かどうかはわかりませんが、T4スクリプトを別のプロジェクトに配置し、MSBuildタスクを使用して生成されたファイルをEFエンティティプロジェクトにコピーすることはできます。

ソリューションには次のものが含まれている必要があります

  1. あなたのEFエンティティプロジェクト、それをエンティティと呼びましょう
  2. エンティティジェネレータプロジェクト(ここに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名前空間

于 2012-06-29T14:45:42.013 に答える