모든 빌드에서 T4 템플릿으로 출력을 생성하려면 어떻게해야합니까? 지금과 같이 템플릿을 변경할 때만 재생성됩니다.
나는 이와 비슷한 다른 질문을 발견했다.
Visual Studio에서 T4 변환 및 빌드 순서 (답변 없음)
Visual Studio에서 t4 파일을 빌드하는 방법은 무엇입니까? (답변은 충분히 상세하지 않고 (아직 복잡하지만) 이해가되지 않습니다)
이 작업을 수행하는 더 간단한 방법이 있어야합니다!
모든 빌드에서 T4 템플릿으로 출력을 생성하려면 어떻게해야합니까? 지금과 같이 템플릿을 변경할 때만 재생성됩니다.
나는 이와 비슷한 다른 질문을 발견했다.
Visual Studio에서 T4 변환 및 빌드 순서 (답변 없음)
Visual Studio에서 t4 파일을 빌드하는 방법은 무엇입니까? (답변은 충분히 상세하지 않고 (아직 복잡하지만) 이해가되지 않습니다)
이 작업을 수행하는 더 간단한 방법이 있어야합니다!
답변:
나는 JoelFan의 대답을 사용하여 이것을 얻었습니다. 새 .tt 파일을 프로젝트에 추가 할 때마다 사전 빌드 이벤트를 수정하지 않아도되므로 더 좋습니다.
%PATH%
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
"%CommonProgramFiles%\Microsoft Shared\TextTemplating\1.2\texttransform.exe"
% PATH %에 추가하는 대신 배치 파일에 TextTransform.exe ( ) 의 전체 경로를 추가하는 것을 선호 했습니다.
%COMMONPROGRAMFILES(x86)%\microsoft shared\TextTemplating\11.0\TextTransform.exe
. 큰 따옴표로 묶으십시오.
TextTransform.exe
. Visual Studio에서 이미 "사용자 지정 도구 실행"을 마우스 오른쪽 단추로 클릭하면 도구 경로가 이미 있습니다. Visual Studio 컨텍스트에서 빌드 할 때 다시 제공해야하는 이유는 무엇입니까?
GarethJ에 동의합니다-VS2010에서는 각 빌드에서 tt 템플릿을 훨씬 쉽게 생성 할 수 있습니다. Oleg Sych의 블로그는이를 수행하는 방법을 설명합니다. 한마디로 :
</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" />
msbuild mySolution.sln /p:CustomAfterMicrosoftCommonTargets="C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\TextTemplating\Microsoft.TextTemplating.targets" /p:TransformOnBuild=true /p:TransformOutOfDateOnly=false
이 작업을 수행하는 훌륭한 NuGet 패키지가 있습니다.
PM> Install-Package Clarius.TransformOnBuild
패키지에 대한 자세한 내용은 여기를 참조하십시오.
content
<#@ template language="C#" #>
MarkGr의 답변을 사용 하여이 솔루션을 개발했습니다. 먼저 주 솔루션 폴더 위의 별도 도구 폴더에 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 는 템플릿에서 Assembly 지시문이 참조하는 DLL의 경로 입니다.
다음으로 T4 템플릿을 포함하는 프로젝트의 프로젝트 속성으로 이동하십시오. 빌드 이벤트 로 이동 하여 다음 사전 빌드 이벤트 명령 행을 추가하십시오 .
$(SolutionDir)..\..\tools\RunTemplate.bat $(ProjectDir)MyTemplate $(OutDir)
MyTemplate 을 .tt 확장자가없는 .tt 파일 (예 : MyTemplate.tt)의 파일 이름으로 바꿉니다 . 이것은 프로젝트를 빌드하기 전에 템플릿을 확장하여 MyTemplate.cs를 생성 한 결과입니다. 그런 다음 실제 빌드는 MyTemplate.cs를 컴파일합니다.
사전 빌드는 한 줄로 줄일 수 있습니다.
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"
물론, 원하는 경우 프로젝트 디렉토리 경로를 전달하는 배치 파일로이를 가져올 수 있습니다.
NB 경로를 약간 조정해야 할 수도 있습니다. 위의 경로는 VS 2008이 내 컴퓨터에 설치 한 위치입니다. 그러나 TextTemplating
와 사이의 버전 번호 TextTransform.exe
가 다를 수 있습니다.
System.Exception: T4MVC can only execute through the Visual Studio host
C : \ Program Files (x86) \ Common Files \ Microsoft Shared \ TextTemplating을 확인하십시오. 명령 줄 변환 exe가 있습니다. 또는 사용자 지정 호스트로 MSBuild 작업을 작성하고 직접 변환하십시오.
Seth Reno 와 JoelFan의 답변을 확장하면서 나는 이것을 생각해 냈습니다. 이 솔루션을 사용하면 새 .tt 파일을 프로젝트에 추가 할 때마다 사전 빌드 이벤트를 수정해야합니다.
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
노트
텍스트 변환에서는 T4 템플리트의 코드가 프로젝트 유형과 동일한 언어라고 가정합니다. 이 경우가 해당되지 않으면 $(ProjectExt)
인수를 코드에서 생성 할 파일의 확장자 로 바꿔야합니다 .
.TT
파일은 빌드하지 않을 프로젝트 디렉토리에 있어야합니다. 첫 번째 인수로 다른 경로를 지정하여 프로젝트 디렉토리 외부에 TT 파일을 빌드 할 수 있습니다 ( 즉"$(ProjectDir)"
, TT 파일이 포함 된 경로로 대체 ).
transform_all.bat
배치 파일 의 올바른 경로를 설정해야 합니다.
예를 들어, 사전 빌드 이벤트가 다음과 같도록 솔루션 디렉토리에 배치했습니다."$(SolutionDir)transform_all.bat" "$(ProjectDir)" $(ProjectExt)
t4list.txt
파일을 PasteBin에 게시 하여 오류가 발생하는지 확인하려고합니까?
for /f "delims=" %%d in (t4list.txt) do (
회사 제한으로 인해 t4list.txt
파일 을 게시 하지 못하는 경우, 도와 드릴 일이 많지 않은 것 같습니다. 정말이 문제를 해결하고 싶었지만 진행할 데이터가 없기 때문에 불가능할 것 같습니다. 문제를 해결하는 데 행운을 빕니다. 성공하면 솔루션을 게시하십시오.
(this.Host as IServiceProvider).GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE;
있습니까? 불행히도 Visual Studio 내부가 아닌 곳에서 tt 를 실행 하면 null 참조 예외가 발생 합니다.
Visual Studio 2010을 사용하는 경우 Visual Studio 모델링 및 시각화 SDK를 사용할 수 있습니다. http://code.msdn.microsoft.com/vsvmsdk
여기에는 빌드시 T4 템플릿을 실행하기위한 msbuild 작업이 포함됩니다.
자세한 설명은 Oleg의 블로그를 참조 하십시오 : 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 및 AddIn 파일을
C : \ Users \ Documents \ Visual Studio 2012 \ Addins \
그리고 당신은 간다.
VS2012에서 작업하려면 Dynamo.AutoTT.AddIn 파일을 수정하고 AddIn 파일에서 버전을 11.0으로 설정해야합니다.
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>
빌드를 두 번 실행하십시오 (처음으로). 저장소에 커미트 된 파일을 이미 생성 한 경우 두 예제 모두에서 재 빌드에 문제가 없습니다.
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 (단일 템플릿에서 여러 파일 생성 포함).
여기 내 해결책이 있습니다-허용 된 답변과 비슷합니다. 소스 컨트롤에 문제가있었습니다. 대상 .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)"
프로젝트의 빌드 전 이벤트에이 명령을 추가하기 만하면됩니다.
if $(ConfigurationName) == Debug $(MSBuildToolsPath)\Msbuild.exe /p:CustomBeforeMicrosoftCSharpTargets="$(ProgramFiles)\MSBuild\Microsoft\VisualStudio\v11.0\TextTemplating\Microsoft.TextTemplating.targets" $(ProjectPath) /t:TransformAll
구성 확인 = 디버그는 예를 들어 TFS 빌드 서버에서 빌드를 수행 할 때 릴리스 모드에서 코드를 재생성하지 않도록합니다.
Visual Studio 2013에서 T4 템플릿을 마우스 오른쪽 단추로 클릭하고 빌드시 변환 속성을 true로 설정하십시오.
여기 내가 어떻게 압정했는지입니다. 링크 . 기본적으로 훌륭한 블로그 (blogs.clariusconsulting.net/kzu/how-to-transform-t4-templates-on-build-with-out-installing-a-visual-studio-sdk/) 위에 구축 할 수 없습니다. links :() Visual Studio proj 파일과 함께 사용하기 위해이 .targets 파일을 생각해 냈습니다 .
.tt 내부에 다른 dll을 사용하고 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 변경시 코드를 생성 할 수 있습니다.
VS가 Visual Studio의 속성에서 사용자 지정 도구를 제거하여 매번 변형과 실패를 시도하지 않도록 할 수 있습니다. 2 단계에서 어셈블리 참조를 제거했기 때문에
T4Executer 는 VS2019에 대해이 작업을 수행합니다. 빌드시 무시할 템플리트를 지정할 수 있으며 빌드 후 실행 옵션이 있습니다.
다음은 Microsoft 툴링 및 표준 경로 만 사용하는 사전 빌드 이벤트입니다. 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는 프로젝트 파일에서 T4ParameterValues 를 사용하여 템플릿에서 "$ (SolutionDirectory)"와 같은 매크로를 사용할 수 있도록 가이드를 제공 합니다.