4

私はコード生成のためにいくつかの素晴らしい構造化されたt4を書き込もうとしています。ロジックを再利用可能な関数に分解し、それらを別々のファイルに入れます(「通常の」コードのように)。問題は、共通ファイルが複数回含まれるため、含めることができないことです。

たとえば、、、、およびの4つCore.ttのファイルがありFile1.ttます。 との両方に含まれています。とが含まれている間File2.ttMainTemplate.ttCore.ttFile1.ttFile2.ttFile1.ttFile2.ttMainTemplate.tt

から出力を生成したい場合MainTemplate.tt、次のエラーが発生します。

Error   8   Compiling transformation: The type 'Microsoft.VisualStudio.TextTemplating62CD98C8FF0EB737CAFBD5ED17A158C3.GeneratedTextTransformation' already contains a definition for 'PropertyAttribute'

Core.ttその理由は、 2回含まれているからだと思います。私の問題の回避策はありますか?C ++では、ヘッダーガードを追加することができます。#ifndef xxx #define xxx #endif

4

3 に答える 3

2

はい、この機能はT4システムに組み込まれています。

T4の「include」ディレクティブは「once」属性をサポートします。これにより、テンプレートが1回だけ含まれるようになり、重複が防止されます。

例:

<#@ include file="filePath.tt" once="true" #>
于 2017-08-17T18:05:54.040 に答える
1

残念ながら、これを機能させる方法を見つけることができませんでした。C#で#defineを使用できる場所に厳しい制限があり、#includeがコードで遅すぎるためです。

この時点での最善の策は、 http: //visualstudio.uservoice.comに機能要求を記録し、サポートを強化することです。

個人的には、この機能を製品に取り入れたいと思っています。

于 2013-02-05T17:52:02.070 に答える
0

次のエラーメッセージで同様の問題が発生していました。

Compiling transformation: The type 'GeneratedTextTransformation' already contains a definition for 'BaseCodegenTemplate'

このテキスト行を++でCTRLプロジェクトを検索しましたSHIFTF

<#@ include file="BaseCodegenTemplate.tt" #>

2つの異なるファイルでこの行が2つ見つかりました。ファイルの1つからオカレンスの1つを削除した後、エラーは消えました。

ただし、BaseCodegenTemplate.ttファイルのincludeステートメントがそのファイルにないため、BaseCodegenTemplate.ttに含まれる型定義がないため、そのファイルの一部のコードが赤い色で強調表示されます。ただし、コード全体は適切にコンパイルされます。BaseCodegenTemplate.ttは別のファイルで参照されるため、BaseCodegenTemplate.ttで定義された型はビルド中に含まれます。

于 2017-08-17T17:59:23.797 に答える