Visual Studioを入手して、すべてのビルドでT4テンプレートを実行する


163

すべてのビルドで出力を生成するT4テンプレートを取得するにはどうすればよいですか?現状では、テンプレートを変更したときにのみ再生成されます。

私はこれに類似した他の質問を見つけました:

Visual StudioでのT4変換とビルド順序(未回答)

Visual StudioでビルドするT4ファイルを取得するにはどうすればよいですか?(答えは十分に詳細ではありません[まだかなり複雑ですが]、完全に意味がありません)

これを行うには、より簡単な方法が必要です!


個人的にはこれに対する答えを聞きたいと思いますが、あなたの特定のシナリオは何ですか?通常、テンプレートの出力は入力のみの関数であるため、変更時に生成しても問題ありません。
Pavel Minaev 2009年

6
私のテンプレートはリフレクションを使用して、前回のビルド以降に変更された可能性のある他のアセンブリを調べます。
JoelFan

この考え方についてはどう:stackoverflow.com/questions/1649649/...
JoelFan

私のテンプレートは1つの目的を果たし、ビルドの日付と時刻を記録します。
スコットソル

回答:


68

私はJoelFanの答えを使ってこれを思い付きました。プロジェクトに新しい.ttファイルを追加するたびにビルド前のイベントを変更する必要がないので、私はそれが好きです。

  • TextTransform.exeを %PATH%
  • transform_all.batという名前のバッチファイルを作成しました(以下を参照)
  • ビルド前のイベント「transform_all ..\..」を作成する

transform_all.bat

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

:: set the working dir (default to current dir)
set wdir=%cd%
if not (%1)==() set wdir=%1

:: set the file extension (default to vb)
set extension=vb
if not (%2)==() set extension=%2

echo executing transform_all from %wdir%
:: create a list of all the T4 templates in the working dir
dir %wdir%\*.tt /b /s > t4list.txt

echo the following T4 templates will be transformed:
type t4list.txt

:: transform all the templates
for /f %%d in (t4list.txt) do (
set file_name=%%d
set file_name=!file_name:~0,-3!.%extension%
echo:  \--^> !file_name!    
TextTransform.exe -out !file_name! %%d
)

echo transformation complete

28
素晴らしい解決策。"%CommonProgramFiles%\Microsoft Shared\TextTemplating\1.2\texttransform.exe"%PATH%に追加するのではなく、バッチファイルにTextTransform.exe()への完全なパスを配置することをお
勧めしました

20
より良い変数は、64ビットシステムでも機能するため、%COMMONPROGRAMFILES%ではなく%COMMONPROGRAMFILES(x86)%です。
Durden81 2012年

3
したがって、フルパスはになります%COMMONPROGRAMFILES(x86)%\microsoft shared\TextTemplating\11.0\TextTransform.exe。二重引用符で囲みます。
northben 2013年

1
@ piers7:スクリプトを実行しているOSの「ビットネス」を自動的に検出するようにコードを更新しました。objディレクトリをスキップするためのnorthbenのコメントも含め、%PATH%環境変数を変更しないようにAdam Nofsingerの設定を実装しました。
Alex Essilfie 2013

1
私見はTextTransform.exe吸い込みへの道を提供する必要があります。Visual Studioで[カスタムツールの実行]を既に右クリックできるので、ツールのパスが既にあります。Visual Studioコンテキストからビルドしているときに、再度提供する必要があるのはなぜですか?
Jez

70

GarethJに同意します-VS2010では、ビルドごとにttテンプレートを再生成する方がはるかに簡単です。Oleg Sychのブログでは、その方法について説明しています。要するに:

  1. Visual Studio SDKをインストールする
  2. Visual Studio 2010 Modeling and Visualization SDKをインストールする
  3. テキストエディタープロジェクトファイルで開き、ファイルの最後に追加します。 </Project>

それでおしまい。プロジェクトを開きます。ビルドごとに、すべての* .ttテンプレートが再処理されます

<!-- This line could already present in file. If it is so just skip it  -->
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- process *.tt templates on each build  -->
<PropertyGroup>
    <TransformOnBuild>true</TransformOnBuild>
</PropertyGroup>
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\TextTemplating\v10.0\Microsoft.TextTemplating.targets" />

2
Oleg Sychのブログ投稿へのリンクは次のとおりです。 。olegsych.com
2010/04

4
これは非常に優れたソリューションです。ただし、SDKのインストールを必要とせずにこれを機能させる方法はありますか?私は.targetsファイルと関連するアセンブリをコピーしてそれを動作させるように努めてきましたが、成功しませんでした。
grimus

3
Chirpyは、SDKをダウンロードしなくても機能しているように見えますが、Chirpyをダウンロードして構成する必要があります。私はまだVS2010のデフォルトインストールで動作するソリューションを見つけようとしています。ソースリポジトリから利用できるため、開発者はリポジトリをチェックアウトするだけで動作します。これらすべての他のソリューションは、開発者ごとに非常に多くの注意を必要とします。
ミール

1
MSBuildのx64バージョンを使用してプロジェクトをビルドすると、次のエラーが発生します。「MSB4019:インポートされたプロジェクト "C:\ Program Files(x86)\ MSBuild \ Microsoft \ VisualStudio \ TextTemplating \ v10.0 \ Microsoft.TextTemplating.targets " 見つかりませんでした。' エラー。回避策-プロジェクトファイルの$(MSBuildExtensionsPath)変数を$(MSBuildExtensionsPath32)に置き換えます。
錆びた'28年

3
さらに、.csprojファイルにパッチを適用する必要はありません。コマンドラインから次のように呼び出します msbuild mySolution.sln /p:CustomAfterMicrosoftCommonTargets="C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\TextTemplating\Microsoft.TextTemplating.targets" /p:TransformOnBuild=true /p:TransformOutOfDateOnly=false
Giulio Vian

29

これだけを行う優れたNuGetパッケージがあります。

PM> Install-Package Clarius.TransformOnBuild

パッケージの詳細は はここにあります


2
「非公式な」フォークがあります:ビルドアクションをサポートするnuget.org/packages/Clarius.TransformOnBuild-unofficialcontent
Erno

1
これは素晴らしい拡張機能ですが、コマンドラインモードでTextTransform.exeを実行しているため、hostspecific = "true"
関数

1
テンプレートの先頭に次の行を追加します。@JenishRabadiya:<#@ template language="C#" #>
ピーター・バンKekem

2
hostspecific = "true"およびその他の問題(8日前)をサポートするようにパッケージが更新されたようです
Mingwei Samuel

1
コンテンツビルドアクションは現在、最新バージョンで動作しています。
アンドロビン

20

MarkGrの答えを使用して、このソリューションを開発しました。最初に、メインソリューションフォルダーの上の別のtoolsフォルダーにRunTemplate.batというバッチファイルを作成します。バッチファイルには次の行があります。

"%CommonProgramFiles%\Microsoft Shared\TextTemplating\1.2\texttransform.exe" -out %1.cs -P %2 -P "%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.5" %1.tt

このバッチファイルは2つのパラメーターを取ります... %1は.tt拡張子なしの.ttファイルへのパスです。 %2は、テンプレートのアセンブリディレクティブによって参照されるDLLへのパスです。

次に、T4テンプレートを含むプロジェクトのプロジェクトプロパティに移動します。ビルドイベントに移動して、次のビルド前イベントコマンドラインを追加します。

$(SolutionDir)..\..\tools\RunTemplate.bat $(ProjectDir)MyTemplate $(OutDir)

MyTemplateを、.tt拡張子なしの.ttファイル(つまり、MyTemplate.tt)のファイル名に置き換えます。これは、プロジェクトをビルドする前にテンプレートを拡張してMyTemplate.csを生成する結果になります。次に、実際のビルドはMyTemplate.csをコンパイルします


:私はまだ問題が持っているがstackoverflow.com/questions/1669893/...
JoelFan

1
$(SolutionDir).. \ .. \ tools \ RunTemplate.batに関する引用符を忘れないでください
Ewald Hofman

14

最近、この素晴らしいVSプラグイン、Chirpyが見つかりました

ビルドでT4を生成するだけでなく、JavaScript、CSSを縮小するT4ベースのアプローチを可能にし、CSSにLESS構文を使用することもできます!


13

おそらく最も簡単な方法は、AutoT4と呼ばれるVisual Studio拡張機能をインストールすることです。

ビルド時にすべてのT4テンプレートを自動的に実行します。


同意しました!構成可能であり、VS 2015で動作します。EnvDTEアセンブリ(ビルド構成を取得するため)の使用もサポートします。唯一の欠点は、すべてのチームメンバーが拡張機能をインストールする必要があることです。
ジャイロマイト2016年

12

事前ビルドを1行に減らすことができます。

forfiles /p "$(ProjectDir)." /m "*.tt" /s /c "cmd /c echo Transforming @path && \"%CommonProgramFiles(x86)%\Microsoft Shared\TextTemplating\1.2\TextTransform.exe\" @file"

これはすべてを変える .tt、プロジェクト内のファイルがれ、ビルド出力にリストされます。

ビルド出力が不要な場合は、「興味深い動作」を回避する必要があります。

forfiles /p "$(ProjectDir)." /m "*.tt" /s /c "cmd /c @\"%CommonProgramFiles(x86)%\Microsoft Shared\TextTemplating\1.2\TextTransform.exe\" @file"

もちろん、必要に応じて、プロジェクトディレクトリパスを渡すバッチファイルにこれを引き出すことができます。

注意:パスには微調整が必​​要な場合があります。上記のパスは、VS 2008が私のマシンにインストールした場所です。ただし、TextTemplatingとの間のバージョン番号TextTransform.exeが異なる場合があります。


@ SprintStar、VS 2012をお持ちの場合は、おそらくより良い方法があります。他の回答には、すでにVS 2010のために、既存のより良い方法についての話
ピーター・テイラー

何もインストールする必要がないため、これが最善の方法です。
ライアンゲイツ

1
ソウ一切1.2ありませんでしたが、そのためにそれを変え12.0ありましたが、このエラーました:System.Exception: T4MVC can only execute through the Visual Studio host
colmde

1
1.2ではなく14.0を使用するようにフォルダーパスを更新するだけで、問題ありません。
ピストルピート

これは私の意見では最良の解決策でした(上記のように14.0を変更しただけです)
Nelson Rodriguez

9

C:\ Program Files(x86)\ Common Files \ Microsoft Shared \ TextTemplatingを確認してください。コマンドライン変換exeがそこにあります。または、カスタムホストを使用してMSBuildタスクを記述し、自分で変換を行います。


1
ああ、2010年には "devenv / Command TextTransformation.TransformAllTemplates / Command File.Exit MySolution.sln"のようなことができますが、ビルドサーバーでときどき壊れる傾向があります。あなたの最善の策は、カスタムホストでMSBuildタスクを記述することです。
MarkGr 2009年

デスクトップビルドの場合は、TransformAllTemplatesを実行するマクロを作成してから、ビルドを作成します。
MarkGr 2009年

7

拡大セス・レノJoelFanさん答えて、私はこれを思いつきました。このソリューションでは、プロジェクトに新しい.ttファイルを追加するたびに事前ビルドイベントを変更することを覚えておく必要はありません。

実施手順

  • transform_all.batという名前のバッチファイルを作成します(以下を参照)
  • ビルドtransform_all.bat "$(ProjectDir)" $(ProjectExt)する.ttを使用して、各プロジェクトのビルド前イベントを作成します

transform_all.bat

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

:: set the correct path to the the app
if not defined ProgramFiles(x86). (
  echo 32-bit OS detected
  set ttPath=%CommonProgramFiles%\Microsoft Shared\TextTemplating\1.2\
) else (
  echo 64-bit OS detected
  set ttPath=%CommonProgramFiles(x86)%\Microsoft Shared\TextTemplating\1.2\
)

:: set the working dir (default to current dir)
if not (%1)==() pushd %~dp1

:: set the file extension (default to vb)
set ext=%2
if /i %ext:~1%==vbproj (
  set ext=vb
) else if /i %ext:~1%==csproj (
  set ext=cs
) else if /i [%ext%]==[] (
  set ext=vb
)

:: create a list of all the T4 templates in the working dir
echo Running TextTransform from %cd%
dir *.tt /b /s | findstr /vi obj > t4list.txt

:: transform all the templates
set blank=.
for /f "delims=" %%d in (t4list.txt) do (
  set file_name=%%d
  set file_name=!file_name:~0,-3!.%ext%
  echo:  \--^> !!file_name:%cd%=%blank%!
  "%ttPath%TextTransform.exe" -out "!file_name!" "%%d"
)

:: delete T4 list and return to previous directory
del t4list.txt
popd

echo T4 transformation complete


ノート

  1. テキスト変換では、T4テンプレートのコードがプロジェクトタイプと同じ言語であると想定しています。このケースが当てはまらない場合は、$(ProjectExt)引数を、コードで生成するファイルの拡張子に置き換える必要があります。

  2. .TTファイルはプロジェクトディレクトリにある必要があります。そうしないとビルドされません。最初の引数として別のパスを指定することで、TTファイルをプロジェクトディレクトリの外に構築できます(つまり"$(ProjectDir)"、TTファイルを含むパスに置き換えます)。

  3. transform_all.batバッチファイルへの正しいパスを設定することも忘れないでください。
    たとえば、ソリューションディレクトリに配置したので、ビルド前のイベントは次のようになりました"$(SolutionDir)transform_all.bat" "$(ProjectDir)" $(ProjectExt)


このアプローチを使用しようとしていますが、「\ Commonは現時点では予期されていませんでした」というエラーが発生し続けます。私の出力では。これは次の行で発生します:/ f "delims =" %% d in(t4list.txt)do ...何が欠けているのでしょうか?
マイケルルイス

@MichaelLewis:エラーの原因を特定することなく、バッチファイルを何度か調べました。Seth Reno提案した方法を試し、同じエラーが発生するかどうかを確認してください。それまでの間、t4list.txtファイルをPasteBinに投稿してください。エラーがそこから発生しているかどうかを確認しますか?
Alex Essilfie

私は同じ問題でSethのアプローチを試しました( '\ Commonは現時点では予期されていませんでした')。会社の制限によりt4list.txtファイルを投稿できませんが、1行で構成されており、\ Commonがパスに表示されません。
マイケルルイス

@MichaelLewis:残念ながら、エラーが発生しfor /f "delims=" %%d in (t4list.txt) do (、企業の制限によりt4list.txtファイルを投稿できない場合、私はあなたを助けるためにできることはあまりないと思います。私は本当にこれを解決したいと思っていましたが、続行するデータがないのでそれは不可能になりそうです。問題を解決するために頑張ってください。成功したらソリューションを投稿してください。
Alex Essilfie 2016

ttが含まれているときに同じことをすることは可能(this.Host as IServiceProvider).GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE;ですか?残念ながら、ビジュアルスタジオ内からではなくttを実行すると、null参照例外が発生します
Andrey K.


4

ねえ、私のスクリプトは出力拡張機能も解析できます

for /r %1 %%f in (*.tt) do (
 for /f "tokens=3,4 delims==, " %%a in (%%f) do (
  if %%~a==extension "%CommonProgramFiles%\Microsoft Shared\TextTemplating\1.2\texttransform.exe" -out %%~pnf.%%~b -P %%~pf -P "%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.5" %%f
 )
)
echo Exit Code = %ERRORLEVEL%

transform_all.bat $(SolutionDir)ビルド前のイベントを作成するだけで、ソリューション内のすべての* .ttファイルが自動的に変換されます。


3

Dynamo.AutoTTが必要なことを行います。正規表現を介してファイルを監視するか、ビルド時に生成するように構成できます。また、トリガーするT4テンプレートを指定することもできます。

こちらからダウンロードできます:https : //github.com/MartinF/Dynamo.AutoTT

ビルドして、dllファイルとAddInファイルを

C:\ Users \ Documents \ Visual Studio 2012 \ Addins \

離れて行きます。

VS2012でそれを実行したい場合は、Dynamo.AutoTT.AddInファイルを変更し、AddInファイル内のバージョンを11.0に設定する必要があります。


3

GitHub.com/Mono/T4のおかげで、現時点では、これを.csprojファイルに追加することで、.NET CoreビルドとVisual Studioビルドの両方で実行できます。

  <ItemGroup>
    <DotNetCliToolReference Include="dotnet-t4-project-tool" Version="2.0.5" />
    <TextTemplate Include="**\*.tt" />
  </ItemGroup>

  <Target Name="TextTemplateTransform" BeforeTargets="BeforeBuild">
    <ItemGroup>
      <Compile Remove="**\*.cs" />
    </ItemGroup>
    <Exec WorkingDirectory="$(ProjectDir)" Command="dotnet t4 %(TextTemplate.Identity)" />
    <ItemGroup>
      <Compile Include="**\*.cs" />
    </ItemGroup>
  </Target>

テンプレートを別のプログラミング言語に変換する場合は、次のようなものを追加する必要が<Compile Remove="**\*.vb" />あります<Compile Include="**\*.vb" />あなたはまだファイルが生成されていない場合でも、コンパイルされ、これらのファイルを入手するために。

RemoveそしてIncludeトリックは初回のみの世代のために必要な、またはあなたは、このようなXMLは、短くすることができます。

  <ItemGroup>
    <DotNetCliToolReference Include="dotnet-t4-project-tool" Version="2.0.5" />
    <TextTemplate Include="**\*.tt" />
  </ItemGroup>

  <Target Name="TextTemplateTransform" BeforeTargets="BeforeBuild">
    <Exec WorkingDirectory="$(ProjectDir)" Command="dotnet t4 %(TextTemplate.Identity)" />
  </Target>

ビルドを2回実行します(初めて)。リポジトリにコミットされたファイルをすでに生成している場合は、両方の例を使用して再構築しても問題はありません。

Visual Studioでは、次のようなものを表示することができます。

ここに画像の説明を入力してください

これの代わりに:

ここに画像の説明を入力してください

したがって、次のようなものをプロジェクトファイルに追加します。

  <ItemGroup>
    <Compile Update="UInt16Class.cs">
      <DependentUpon>UInt16Class.tt</DependentUpon>
    </Compile>
    <Compile Update="UInt32Class.cs">
      <DependentUpon>UInt32Class.tt</DependentUpon>
    </Compile>
    <Compile Update="UInt64Class.cs">
      <DependentUpon>UInt64Class.tt</DependentUpon>
    </Compile>
    <Compile Update="UInt8Class.cs">
      <DependentUpon>UInt8Class.tt</DependentUpon>
    </Compile>
  </ItemGroup>

ここに完全な例:GitHub.com/Konard/T4GenericsExample(単一のテンプレートからの複数のファイルの生成を含む)。


1

これが私の解決策です-受け入れられた答えに似ています。ソース管理に問題がありました。ターゲットの.csファイルは読み取り専用で、T4は失敗していました。これは、tempフォルダーでT4を実行し、ターゲットファイルを比較し、同じ変更の場合にのみコピーするコードです。read.onlyファイルの問題は修正されませんが、少なくともそれほど頻繁には発生しません。

Transform.bat

ECHO Transforming T4 templates
SET CurrentDirBackup=%CD%
CD %1
ECHO %1
FOR /r %%f IN (*.tt) DO call :Transform %%f
CD %CurrentDirBackup%
ECHO T4 templates transformed
goto End

:Transform
set ttFile=%1
set csFile=%1

ECHO Transforming %ttFile%:
SET csFile=%ttFile:~0,-2%cs
For %%A in ("%ttFile%") do Set tempTT=%TEMP%\%%~nxA
For %%A in ("%csFile%") do Set tempCS=%TEMP%\%%~nxA

copy "%ttFile%" "%tempTT%
"%COMMONPROGRAMFILES(x86)%\microsoft shared\TextTemplating\11.0\TextTransform.exe"  "%tempTT%"

fc %tempCS% %csFile% > nul
if errorlevel 1 (
 :: You can try to insert you check-out command here.
 "%COMMONPROGRAMFILES(x86)%\microsoft shared\TextTemplating\11.0\TextTransform.exe"  "%ttFile%"
) ELSE (
 ECHO  no change in %csFile%
)

del %tempTT%
del %tempCS%
goto :eof

:End

行にチェックアウトコマンドを追加することができます(::試すことができます....)

プロジェクトで、これを事前構築アクションとして設定します。

Path-To-Transform.bat "$(ProjectDir)"

1

このコマンドをプロジェクトの事前ビルドイベントに追加するだけです。

if $(ConfigurationName) == Debug $(MSBuildToolsPath)\Msbuild.exe  /p:CustomBeforeMicrosoftCSharpTargets="$(ProgramFiles)\MSBuild\Microsoft\VisualStudio\v11.0\TextTemplating\Microsoft.TextTemplating.targets"  $(ProjectPath) /t:TransformAll 

configuration = debugのチェックは、たとえばTFSビルドサーバーでビルドを行うときに、リリースモードでコードを再生成しないことを確認します。


ニースしかしT4MVCだけでなく、プロジェクト内のTTであり、我々はすべてを実行したくない...場合は、すべてのは危険なことができ転換
Landeeyo

3
v11.0フォルダーにTextTemplatingがありません。どこから手に入れましたか?
Zack

1

Visual Studio 2013で、T4テンプレートを右クリックし、ビルドプロパティの変換をtrueに設定します。


1
右クリックメニューでこのオプションを見つけることができませんが、MSDNによると、VS 2012および2013でプロジェクトファイルを編集することで可能です。msdn.microsoft.com / en- us / library / ee847423を参照してください。詳細については、aspxまたはmsdn.microsoft.com/en-us/library/vstudio/ee847423.aspx
yoel halb

これは、有形のT4ツールのみに付属するオプションであり、Visual Studioのデフォルトではないようです。
Matt DiTrolio、2015年

ええ、これはT4 Toolboxのプロバージョンでのみです。
ポンペア、2015年

1

これが私がそれに取り組んだ方法です。リンク。基本的に素晴らしいブログの上に構築する(blogs.clariusconsulting.net/kzu/how-to-transform-t4-templates-on-build-without-installing-a-visual-studio-sdk/ can not post post more 2リンク:()この.targetsを思いついた Visual Studioのprojファイルで使用するためのファイルを。

.tt内で他のdll-sを使用していて、dll-sの変更に伴って結果を変更したい場合に便利です。

使い方:

  1. ttを作成し、アセンブリname = "$(SolutionDir)path \ to \ other \ project \ output \ foo.dllを追加して、変換と結果を期待どおりに設定します
  2. .ttからアセンブリ参照を削除する

  3. projファイル内で、次のコードを使用してビルド時に変換を設定します。

    <PropertyGroup>
      <!-- Initial default value -->
      <_TransformExe>$(CommonProgramFiles)\Microsoft Shared\TextTemplating\10.0\TextTransform.exe</_TransformExe>
      <!-- If explicit VS version, override default -->
      <_TransformExe Condition="'$(VisualStudioVersion)' != ''">$(CommonProgramFiles)\Microsoft Shared\TextTemplating\$(VisualStudioVersion)\TextTransform.exe</_TransformExe>
      <!-- Cascading probing if file not found -->
      <_TransformExe Condition="!Exists('$(_TransformExe)')">$(CommonProgramFiles)\Microsoft Shared\TextTemplating\10.0\TextTransform.exe</_TransformExe>
      <_TransformExe Condition="!Exists('$(_TransformExe)')">$(CommonProgramFiles)\Microsoft Shared\TextTemplating\11.0\TextTransform.exe</_TransformExe>
      <_TransformExe Condition="!Exists('$(_TransformExe)')">$(CommonProgramFiles)\Microsoft Shared\TextTemplating\12.0\TextTransform.exe</_TransformExe>
      <!-- Future proof 'til VS2013+2 -->
      <_TransformExe Condition="!Exists('$(_TransformExe)')">$(CommonProgramFiles)\Microsoft Shared\TextTemplating\13.0\TextTransform.exe</_TransformExe>
      <_TransformExe Condition="!Exists('$(_TransformExe)')">$(CommonProgramFiles)\Microsoft Shared\TextTemplating\14.0\TextTransform.exe</_TransformExe>
      <_TransformExe Condition="!Exists('$(_TransformExe)')">$(CommonProgramFiles)\Microsoft Shared\TextTemplating\15.0\TextTransform.exe</_TransformExe>
    
      <IncludeForTransform>@(DllsToInclude, '&amp;quot; -r &amp;quot;')</IncludeForTransform>
    </PropertyGroup>
    • 最初の部分はTextTransform.exeを探します

    • $(IncludeForTransform)これはc:\path\to\dll\foo.dll' -r c:\path\to\dll\bar.dll、コマンドラインでTextTransformの参照を追加する方法だからです。

       <Target Name="TransformOnBuild" BeforeTargets="BeforeBuild">
         <!--<Message Text="$(IncludeForTransform)" />-->
         <Error Text="Failed to find TextTransform.exe tool at '$(_TransformExe)." Condition="!Exists('$(_TransformExe)')" />
         <ItemGroup>
           <_TextTransform Include="$(ProjectDir)**\*.tt" />
         </ItemGroup>
         <!-- Perform task batching for each file -->
         <Exec Command="&quot;$(_TransformExe)&quot; &quot;@(_TextTransform)&quot; -r &quot;$(IncludeForTransform)&quot;" Condition="'%(Identity)' != ''" />
       </Target>
    • <_TextTransform Include="$(ProjectDir)**\*.tt" />これにより、プロジェクトとサブディレクトリ内のすべてのttファイルのリストが作成されます

    • <Exec Command="... 見つかった各.ttファイルに対して次のような行を生成します "C:\path\to\Transform.exe" "c:\path\to\my\proj\TransformFile.tt" -r"c:\path\to\foo.dll" -r "c:\path\to\bar.dll"

  4. あとは、次の場所にDLLへのパスを追加するだけです。

        <ItemGroup>
          <DllsToInclude Include="$(ProjectDir)path\to\foo.dll">
            <InProject>False</InProject>
          </DllsToInclude>
          <DllsToInclude Include="$(ProjectDir)path\to\bar.dll">
            <InProject>False</InProject>
          </DllsToInclude>
        </ItemGroup>

    ここで<InProject>False</InProject>は、ソリューションビューからこれらのアイテムを非表示にします

これで、ビルド時とdll-sの変更時にコードを生成できるようになります。

カスタムツールを(Visual Studio内のプロパティから)削除して、VSが毎回変身したり失敗したりしないようにすることができます。手順2でアセンブリ参照を削除したため


より多くのコンテキストを提供するために、ソリューション自体を回答に追加してください。リンクは質問に対する解決策ではなく、後で他のユーザーがこの質問に戻ってきたときに無効になる可能性があります。
フランクファンWijk 2016年


1

NuGetパッケージをインストールするだけです:Clarius.TransformOnBuild

その後、[ プロジェクトの再構築(またはソリューション)]をクリックするたびに、.ttファイルが実行されます


1

Visual Studio 2017(おそらく次のバージョンも)では、これをPre-buildイベントに追加する必要があります。

"$(DevEnvDir)TextTransform.exe" -out "$(ProjectDir)YourTemplate.cs" "$(ProjectDir)YourTemplate.tt"

psテンプレートがルートプロジェクトディレクトリにない場合は、テンプレートのパスを変更します。


0

ある人nugetパッケージを作りましたこのために。

補足:TextTemplate.exeとそのパッケージの両方からコンパイルエラーが発生します(そのパッケージはTextTemplate.exeを呼び出すため)。VisualStudioからはそうではありません。明らかに、動作は同じではありません。注意喚起。

編集:これは結局私の問題でした。


0

以下は、Microsoft Toolingと標準パスのみを使用したビルド前のイベントです。vs2019 / netcore3.1でテストされています。

「AppDbContext.tt」をプロジェクトの相対ファイルパスに置き換えます。

"$(MSBuildBinPath)\msbuild" $(SolutionPath) /t:$(ProjectName):Transform /p:TransformFile="AppDbContext.tt" /p:CustomAfterMicrosoftCommonTargets="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\TextTemplating\Microsoft.TextTemplating.targets"

Microsoftには、「$(SolutionDirectory)」のようなマクロをテンプレートで使用できるようにするためのガイドもあります プロジェクトファイルでT4ParameterValuesをます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.