문제

모든 빌드에서 출력을 생성하기 위해 T4 템플릿을 얻으려면 어떻게해야합니까? 지금처럼 템플릿을 변경할 때만 재생합니다.

나는 이것과 유사한 다른 질문을 발견했다.

T4 Visual Studio에서 T4 변환 및 구축 순서 (보답 없는)

T4 파일을 Visual Studio에서 구축하는 방법은 무엇입니까? (답변은 충분하지 않지만 [여전히 복잡하지만] 완전히 의미가 없습니다)

이 작업을 수행하는 더 간단한 방법이 있어야합니다!

도움이 되었습니까?

해결책

나는 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

다른 팁

Garethj에 동의합니다. VS2010에서는 각 빌드에서 TT 템플릿을 재생하는 것이 훨씬 쉽습니다. Oleg Sych의 블로그는이를 수행하는 방법을 설명합니다. 요컨대 :

  1. 설치 Visual Studio SDK
  2. 설치 Visual Studio 2010 모델링 및 시각화 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" />

이것을하는 훌륭한 너겟 패키지가 있습니다.

PM> Install-Package Clarius.TransformOnBuild

패키지에 대한 자세한 내용은 가능합니다 여기에서 찾았습니다

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 언급 된 모든 DLL의 경로입니다 집회 템플릿의 지시문.

다음으로 T4 템플릿이 포함 된 프로젝트의 프로젝트 속성으로 이동하십시오. 들어가다 이벤트 구축 다음을 추가하십시오 사전 건축 이벤트 명령 줄:

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

교체 mytemplate .tt extension이없는 .tt 파일 (예 : mytemplate.tt)의 파일 이름으로. 프로젝트를 구축하기 전에 템플릿을 확장하여 mytemplate.cs를 생성 한 결과가 있습니다. 실제 빌드는 myTemplate.cs를 컴파일합니다

최근 에이 위대한 대 플러그인을 발견했습니다. 쾌활한.

빌드에서 T4를 생성 할뿐만 아니라 JavaScript, CSS의 조정에 대한 T4 기반 접근 방식을 허용하며 심지어 CSS에 적은 구문을 사용할 수 있습니다!

아마도 가장 간단한 방법은 Autot4.

자동으로 빌드에서 모든 T4 템플릿을 실행합니다.

사전 구축은 단일 라인으로 줄일 수 있습니다.

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 은 다르다.

C : Program Files (x86) Common Files Microsoft Shared TextTemplating 명령 줄 변환이 있습니다. 또는 사용자 정의 호스트와 함께 MSBuild 작업을 작성하고 직접 변환을 수행하십시오.

확장 세스 리노 그리고 Joelfan 's 답, 나는 이것을 생각해 냈다. 이 솔루션을 사용하면 프로젝트에 새 .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)

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는 필요한 일을 할 것입니다. Regex를 통해 파일을 시청하거나 빌드에서 생성하도록 구성 할 수 있습니다. 또한 트리거하려는 T4 템플릿을 지정할 수 있습니다.

여기에서 다운로드 할 수 있습니다. https://github.com/martinf/dynamo.autott

그냥 빌드, dll 및 addin 파일을 다시 복사하십시오.

C : Users Documents Visual Studio 2012 addins

그리고 멀리 당신은 간다.

VS2012에서 진행하려면 ADINA.AUTOTT.ADDIN 파일을 수정하고 AddIn 파일 내부에서 11.0으로 버전을 설정해야합니다.

여기에 내 해결책이 있습니다 - 허용 된 답변과 유사합니다. 우리는 소스 컨트롤에 문제가있었습니다. 대상 .CS 파일은 읽기 전용이며 T4가 실패했습니다. 다음은 임시 폴더에서 T4를 실행하고 대상 파일을 비교하고 동일한 변경의 경우에만 복사하는 코드입니다. 그것은 읽기의 문제를 해결하지 못하지만 적어도 파일만으로는 자주 발생하지 않습니다.

변환 .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 

Configuration = Debug에서 확인하면 TFS 빌드 서버에서 빌드를 수행 할 때 릴리스 모드에서 코드를 재생하지 않도록하십시오.

Visual Studio 2013에서 T4 템플릿을 마우스 오른쪽 버튼으로 클릭하고 빌드 속성의 변환을 True로 설정하십시오.

여기에 내가 그것을 어떻게 해결했는지는 다음과 같습니다. 링크. 기본적으로 훌륭한 블로그 위에 구축하십시오 (blogs.clariusconsulting.net/kzu/how-to-transform-templates-on-build-without-installing-a-visual-studio-sdk/ 2를 더 많이 게시 할 수 없습니다. 링크 :() 나는 이것을 생각해 냈다 . 표적 Visual Studio Proj 파일과 함께 사용할 파일.

.tt 내부에서 다른 DLL-S를 사용하는 경우 유용하며 DLL-S가 변경됨에 따라 결과가 변경되기를 원합니다.

작동 방식 :

  1. tt를 만들고, 어셈블리 이름 = "$ (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 그것이 명령 줄에서 텍스트 변환에 대한 참조를 추가하는 방법이기 때문입니다.

       <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 변경에 대한 코드를 생성 할 수 있어야합니다.

VS가 매번 비참하게 변환하고 실패하지 않도록 사용자 정의 도구 (Visual Studio 내부의 속성에서)를 제거 할 수 있습니다. 2 단계에서 어셈블리 참조를 제거했기 때문입니다

t4executer VS2019에 대해이를 수행합니다. 빌드에서 무시할 템플릿을 지정할 수 있으며 빌드 옵션 후 실행이 있습니다.

어떤 남자 구축 된 a 너겟 패키지 이것을 위해.

참고 사항 : TextTemplate.exe와 해당 패키지에서 컴파일 오류가 발생하지만 (패키지는 TextTemplate.exe를 호출하기 때문에) Visual Studio에서는 그렇지 않습니다. 따라서 분명히 행동은 동일하지 않습니다. 머리 위로.

편집하다: 이것 결국 내 문제가되었습니다.

Nuget 패키지를 설치합니다. Clarius.TransformonBuild

그런 다음 클릭 할 때마다 재건 프로젝트 (또는 솔루션), 귀하의 .tt 파일이 실행됩니다

Visual Studio 2017 (아마도 다음 버전)에서는 사전 건축 이벤트에 추가해야합니다.

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

PS 템플릿이 루트 프로젝트 디렉토리에 있지 않은 경우 템플릿으로 경로를 변경하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top