Visual Studioを入手して、ビルドごとにT4テンプレートを実行します
-
22-07-2019 - |
質問
ビルドごとに出力を生成するT4テンプレートを取得するにはどうすればよいですか?現在のところ、テンプレートに変更を加えた場合にのみ再生成されます。
これに似た他の質問を見つけました:
Visual StudioでのT4変換とビルド順序(未回答)
t4ファイルを取得してビジュアルにビルドする方法スタジオ?(回答は十分に詳細ではありませんが(まだかなり複雑ですが)完全には意味がありません)
これを行うには、もっと簡単な方法が必要です!
解決
JoelFanの回答を使用して、これを作成しました。新しい.ttファイルをプロジェクトに追加するたびに、ビルド前イベントを変更することを覚えておく必要がないので、私はそれがより好きです。
- TextTransform.exeを
%PATH%
に追加します
- transform_all.batという名前のバッチファイルを作成しました(以下を参照)
- ビルド前イベントを作成<!> quot;
transform_all ..\..
<!> quot;
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
他のヒント
GarethJに同意します-VS2010では、ビルドごとにttテンプレートを再生成する方がはるかに簡単です。 Oleg Sychのブログでその方法を説明しています。要するに:
- インストール Visual Studio SDK
- VisualをインストールするStudio 2010モデリング および可視化SDK
- テキストエディタープロジェクトファイルで開き、
ファイルの最後に追加しますが、
</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" />
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をコンパイルします
最近、この優れたVSプラグイン Chirpy が見つかりました。
ビルド時にT4を生成するだけでなく、javascript、CSSの縮小にT4ベースのアプローチを可能にし、CSSにLESS構文を使用することさえできます!
おそらく最も簡単な方法は、 AutoT4 。
ビルド時にすべてのT4テンプレートを自動的に実行します。
事前ビルドは1行に減らすことができます:
forfiles /p "$(ProjectDir)." /m "*.tt" /s /c "cmd /c echo Transforming @path && \"%CommonProgramFiles(x86)%\Microsoft Shared\TextTemplating\1.2\TextTransform.exe\" @file"
これにより、プロジェクト内のすべての.tt
ファイルが変換され、ビルド出力にリストされます。
ビルド出力が必要ない場合は、いくつかの <!> quot;興味深い動作<!> quot; :
forfiles /p "$(ProjectDir)." /m "*.tt" /s /c "cmd /c @\"%CommonProgramFiles(x86)%\Microsoft Shared\TextTemplating\1.2\TextTransform.exe\" @file"
もちろん、これをバッチファイルに引き出して、プロジェクトディレクトリパスを渡すことができます。
NB パスを微調整する必要がある場合があります。上記のパスは、VS 2008がマシン上でインストールした場所です。ただし、TextTemplating
とTextTransform.exe
のバージョン番号が異なる場合があります。
チェックアウト C:\ Program Files(x86)\ Common Files \ Microsoft Shared \ TextTemplating そこにコマンドライン変換exeがあります。または、カスタムホストを使用してMSBuildタスクを記述し、自分で変換を行います。
Seth Reno および JoelFanのの答え、私はこれを思いつきました。このソリューションでは、プロジェクトに新しい.ttファイルを追加するたびに、ビルド前イベントを変更することを覚えておく必要はありません。
実装手順
- transform_all.batという名前のバッチファイルを作成します(以下を参照)
- ビルドする.ttを使用してプロジェクトごとにビルド前イベント
transform_all.bat "$(ProjectDir)" $(ProjectExt)
を作成します
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
注
-
テキスト変換では、T4テンプレートのコードがプロジェクトタイプと同じ言語であると想定しています。このケースが当てはまらない場合は、
$(ProjectExt)
引数をコードで生成するファイルの拡張子に置き換える必要があります。 -
.TT
ファイルはプロジェクトディレクトリに存在する必要があります。そうでない場合、ファイルはビルドされません。別のパスを最初の引数として指定することにより、プロジェクトディレクトリ外でTTファイルを構築できます( i.e。を"$(ProjectDir)"
をTTファイルを含むパスに置き換えます)。 -
transform_all.bat
バッチファイルへの正しいパスを設定することも忘れないでください。
たとえば、ソリューションディレクトリに配置したため、ビルド前のイベントは次のようになりました"$(SolutionDir)transform_all.bat" "$(ProjectDir)" $(ProjectExt)
Visual Studio 2010を使用している場合、Visual Studio Modeling and Visualization SDKを使用できます。 http://code.msdn.microsoft.com/vsvmsdk
これには、ビルド時にT4テンプレートを実行するためのmsbuildタスクが含まれます。
詳細については、オレグのブログをご覧ください。 http://www.olegsych.com/2010/04/understanding-t4 -msbuild-integration
ねえ、 私のスクリプトは出力拡張機能も解析できます
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ファイルが自動的に変換されます。
Dynamo.AutoTTは必要なことを行います。正規表現を介してファイルを監視したり、ビルド時に生成するように構成できます。また、トリガーするT4テンプレートを指定することもできます。
ここからダウンロードできます: https://github.com/MartinF/Dynamo.AutoTT
ビルドするだけで、dllファイルとアドインファイルをコピーします
C:\ Users \ Documents \ Visual Studio 2012 \ Addins \
そしてあなたは去ります。
VS2012で使用するには、Dynamo.AutoTT.AddInファイルを変更し、AddInファイル内でバージョンを11.0に設定する必要があります。
ここに私の解決策があります-受け入れられた答えに似ています。 ソース管理に問題がありました。ターゲットの.csファイルは読み取り専用であり、T4は失敗していました。 一時フォルダーで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
1行にチェックアウトコマンドを追加することができます(:: ....)を試すことができます
プロジェクトでこれを事前ビルドアクションとして設定します。
Path-To-Transform.bat "$(ProjectDir)"
このコマンドをプロジェクトのビルド前イベントに追加するだけです。
if $(ConfigurationName) == Debug $(MSBuildToolsPath)\Msbuild.exe /p:CustomBeforeMicrosoftCSharpTargets="$(ProgramFiles)\MSBuild\Microsoft\VisualStudio\v11.0\TextTemplating\Microsoft.TextTemplating.targets" $(ProjectPath) /t:TransformAll
configuration = debugのチェックでは、たとえばTFSビルドサーバーでビルドを行うときに、リリースモードでコードを再生成しないようにします。
Visual Studio 2013で、T4テンプレートを右クリックし、ビルドプロパティの変換をtrueに設定します。
ここに、私がどのように取り組んだかを示します。 リンク。基本的に素晴らしいブログの上に構築する(blogs.clariusconsulting.net/kzu/how-to-transform-t4-templates-on-build-without-installing-a-visual-studio-sdk/はそれ以上投稿できないリンク:()使用する .targets ファイルを思いついたVisual Studio PROJファイルを使用します。
.tt内で他のdll-sを使用していて、dll-sの変更に合わせて結果を変更したい場合に便利です。
仕組み:
- ttを作成し、アセンブリ名= <!> quot; $(SolutionDir)path \ to \ other \ project \ output \ foo.dllを追加し、変換と結果を期待どおりに設定します
-
.ttからアセンブリ参照を削除
-
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, '&quot; -r &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=""$(_TransformExe)" "@(_TextTransform)" -r "$(IncludeForTransform)"" 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"
のような行を生成します
-
-
残っているのは、次の内部の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でアセンブリ参照を削除したため
T4Executer はVS2019に対してこれを行います。ビルド時に無視するテンプレートを指定でき、ビルド後実行オプションがあります。
誰かが nugetパッケージを作成しました。
補足:TextTemplate.exeとそのパッケージの両方からコンパイルエラーが発生します(そのパッケージはTextTemplate.exeを呼び出すため)。ただし、Visual Studioからは発生しません。したがって、明らかに動作は同じではありません。ヘッズアップ。
編集:これは最終的に私の問題になりました。
NuGetパッケージをインストールするだけです: Clarius.TransformOnBuild
その後、 Rebuild プロジェクト(またはソリューション)をクリックするたびに、 .tt ファイルが実行されます
Visual Studio 2017(おそらく次のバージョンも)では、ビルド前イベントにこれを追加する必要があります:
"$(DevEnvDir)TextTransform.exe" -out "$(ProjectDir)YourTemplate.cs" "$(ProjectDir)YourTemplate.tt"
p.s。ルートプロジェクトディレクトリにない場合は、テンプレートのパスを変更します。