모든 빌드에서 Visual Studio를 통해 T4 템플릿 실행


163

모든 빌드에서 T4 템플릿으로 출력을 생성하려면 어떻게해야합니까? 지금과 같이 템플릿을 변경할 때만 재생성됩니다.

나는 이와 비슷한 다른 질문을 발견했다.

Visual Studio에서 T4 변환 및 빌드 순서 (답변 없음)

Visual Studio에서 t4 파일을 빌드하는 방법은 무엇입니까? (답변은 충분히 상세하지 않고 (아직 복잡하지만) 이해가되지 않습니다)

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


개인적으로 이에 대한 답변을 듣는 데 관심이 있지만 특정 시나리오는 무엇입니까? 일반적으로 템플릿의 출력은 입력의 기능이어야하므로 변경시 생성하는 것이 좋습니다.
Pavel Minaev가

6
내 템플릿은 리플렉션을 사용하여 마지막 빌드 이후 변경되었을 수있는 다른 어셈블리를 검사합니다.
JoelFan

이 아이디어에 대해 무엇 : stackoverflow.com/questions/1649649/...
JoelFan

내 템플릿은 하나의 목적으로 사용되며 빌드 날짜 시간을 기록합니다.
Scott Solmer

답변:


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 ( ) 의 전체 경로를 추가하는 것을 선호 했습니다.
Adam Nofsinger

20
더 나은 변수는 64 비트 시스템에서도 작동하기 때문에 % COMMONPROGRAMFILES % 대신 % COMMONPROGRAMFILES (x86) %입니다.
Durden81

3
따라서 전체 경로는입니다 %COMMONPROGRAMFILES(x86)%\microsoft shared\TextTemplating\11.0\TextTransform.exe. 큰 따옴표로 묶으십시오.
northben

1
@ piers7 : 스크립트를 실행하는 OS의 '비트'를 자동으로 감지하도록 코드를 업데이트했습니다. 나는 obj 디렉토리를 건너 뛰기 위해 northben의 의견을 포함 시켰으며 % PATH % 환경 변수를 수정하지 않는 것에 대한 Adam Nofsinger의 환경 설정을 구현했습니다.
Alex Essilfie

1
IMHO는 경로를 제공해야합니다 TextTransform.exe. Visual Studio에서 이미 "사용자 지정 도구 실행"을 마우스 오른쪽 단추로 클릭하면 도구 경로가 이미 있습니다. Visual Studio 컨텍스트에서 빌드 할 때 다시 제공해야하는 이유는 무엇입니까?
Jez

70

GarethJ에 동의합니다-VS2010에서는 각 빌드에서 tt 템플릿을 훨씬 쉽게 생성 할 수 있습니다. Oleg Sych의 블로그는이를 수행하는 방법을 설명합니다. 한마디로 :

  1. Visual Studio SDK 설치
  2. 설치 비주얼 스튜디오 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" />

2
다음은 Oleg Sych의 블로그 게시물에 대한 링크입니다. olegsych.com/2010/04/understanding-t4-msbuild-integration
PhilChuang

4
이것은 매우 좋은 해결책입니다. 그러나 SDK를 설치하지 않고도 작동하도록하는 방법이 있습니까? .targets 파일과 관련 어셈블리를 복사하여 성공했지만 성공하지 못했습니다.
grimus

3
Chirpy는 SDK를 다운로드하지 않아도 작동하는 것처럼 보이지만 Chirpy를 다운로드하고 구성해야합니다. 나는 여전히 VS2010의 기본 설치에서 작동하는 솔루션을 찾으려고 노력하고 있으며 개발자가 리포지토리를 확인하기 만하면 소스 리포지토리를 통해 사용할 수 있습니다. 다른 모든 솔루션에는 개발자마다 너무 많은주의가 필요합니다.
Mir

1
x64 버전의 MSBuild를 사용하여 프로젝트를 빌드하는 경우 다음 오류가 발생합니다. 'MSB4019 : 가져온 프로젝트 "C : \ Program Files (x86) \ MSBuild \ Microsoft \ VisualStudio \ TextTemplating \ v10.0 \ Microsoft.TextTemplating.targets " 찾을 수 없습니다.' 오류. 해결 방법-프로젝트 파일에서 $ (MSBuildExtensionsPath) 변수를 $ (MSBuildExtensionsPath32)로 바꾸십시오.
Rusted

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
멋진 확장이지만 commandLine 모드에서 TextTransform.exe를 실행하므로 hostspecific = "true"기능작동하지 않습니다.
Gh61

1
@JenishRabadiya이 라인을 템플릿의 상단에 추가하십시오 :<#@ template language="C#" #>
Peter van Kekem

2
패키지가 hostspecific = "true" 및 기타 문제 를 지원하도록 업데이트 된 것으로 보입니다 (8 일 전)
Mingwei Samuel

1
컨텐츠 빌드 조치가 최신 버전으로 작동 중입니다.
androbin

20

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를 컴파일합니다.


여전히 문제가 있지만 stackoverflow.com/questions/1669893/…
JoelFan

1
$ (SolutionDir) 주위의 인용문을 잊지 마십시오 .. \ .. \ tools \ RunTemplate.bat
Ewald Hofman

14

최근에이 위대한 VS 플러그인 발견 쾌활한를 .

빌드에서 T4를 생성 할뿐만 아니라 자바 스크립트, CSS를 최소화하기위한 T4 기반 접근을 허용하며 CSS에 대해 LESS 구문을 사용할 수도 있습니다!


13

아마도 가장 간단한 방법은 AutoT4 라는 Visual Studio 확장을 설치하는 입니다.

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


동의했다! 구성 가능하고 VS 2015와 함께 작동합니다. EnvDTE 어셈블리 (빌드 구성을 얻기위한)의 사용도 지원하지만 모든 방법이 아닙니다. 유일한 단점은 모든 팀 구성원이 확장을 설치해야한다는 것입니다.
자이로 마이트

12

사전 빌드는 한 줄로 줄일 수 있습니다.

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가 다를 수 있습니다.


@SprintStar, VS 2012가 있다면 더 좋은 방법이 있습니다. 다른 답변은 이미 VS 2010에 대한 기존의 더 나은 방법에 대해 이야기
피터 테일러

아무것도 설치할 필요가 없기 때문에 이것이 가장 좋은 방법입니다.
Ryan Gates

1
1.2는 없었지만 12.0이 있었으므로 그것을 변경했지만 다음과 같은 오류가 발생했습니다.System.Exception: T4MVC can only execute through the Visual Studio host
colmde

1
1.2 대신 14.0을 사용하도록 폴더 경로를 업데이트해야했습니다.
pistol-pete

이것은 내 의견으로는 가장 좋은 해결책이었다 (위에서 언급 한대로 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

데스크탑 빌드의 경우 TransformAllTemplates를 수행하는 매크로를 만든 다음 빌드하십시오.
MarkGr

7

Seth RenoJoelFan의 답변을 확장하면서 나는 이것을 생각해 냈습니다. 이 솔루션을 사용하면 새 .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 ="(% 4d.txt에서 %% d) 수행 할 작업 ... 내가 무엇을 놓치고 있는지 아십니까?
Michael Lewis

@ MichaelLewis : 오류의 원인을 발견하지 않고 배치 파일을 여러 번 살펴 보았습니다. 좋은 말하려고 세스 리노에 의해 제안 된 방법 이 같은 오류가 발생하는지 확인합니다. 그동안t4list.txt 파일을 PasteBin에 게시 하여 오류가 발생하는지 확인하려고합니까?
Alex Essilfie

같은 문제로 Seth의 접근 방식을 시도했습니다 ( '\ Common은 현재 예상치 못한 것입니다'). 회사 제한으로 인해 t4list.txt 파일을 게시 할 수 없지만 한 줄로 구성되며 경로에 \ Common이 나타나지 않습니다.
Michael Lewis

@MichaelLewis : 불행히도, 오류가 발생하여 for /f "delims=" %%d in (t4list.txt) do (회사 제한으로 인해 t4list.txt파일 을 게시 하지 못하는 경우, 도와 드릴 일이 많지 않은 것 같습니다. 정말이 문제를 해결하고 싶었지만 진행할 데이터가 없기 때문에 불가능할 것 같습니다. 문제를 해결하는 데 행운을 빕니다. 성공하면 솔루션을 게시하십시오.
Alex Essilfie

tt 가 포함되어 있을 때도 동일한 작업을 수행 할 수 (this.Host as IServiceProvider).GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE;있습니까? 불행히도 Visual Studio 내부가 아닌 곳에서 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>

빌드를 두 번 실행하십시오 (처음으로). 저장소에 커미트 된 파일을 이미 생성 한 경우 두 예제 모두에서 재 빌드에 문제가 없습니다.

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 

구성 확인 = 디버그는 예를 들어 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

이것은 Visual Studio에서는 기본값이 아닌 유형의 T4 도구에만 제공되는 옵션 인 것 같습니다.
Matt DiTrolio

예, 이것은 T4 Toolbox 의 프로 버전 에만 있습니다.
Pompair

1

여기 내가 어떻게 압정했는지입니다. 링크 . 기본적으로 훌륭한 블로그 (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이 변경됨에 따라 결과를 변경하려는 경우에 유용합니다.

작동 방식 :

  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즉 명령 행에 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 변경시 코드를 생성 할 수 있습니다.

VS가 Visual Studio의 속성에서 사용자 지정 도구를 제거하여 매번 변형과 실패를 시도하지 않도록 할 수 있습니다. 2 단계에서 어셈블리 참조를 제거했기 때문에


더 많은 컨텍스트를 제공하기 위해 솔루션 자체를 답변에 추가하십시오. 링크는 질문에 대한 해결책이 아니며 나중에 다른 사용자가이 질문으로 돌아올 때 죽을 수 있습니다.
Frank van Wijk 2012 년


1

NuGet Package : Clarius.TransformOnBuild를 설치하기 만하면됩니다.

그런 다음 프로젝트 다시 작성 (또는 솔루션) 을 클릭 할 때마다 .tt 파일이 실행됩니다.


1

Visual Studio 2017 (아마도 다음 버전)에서도 빌드 전 이벤트에이를 추가해야합니다.

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

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


0

어떤 사람 은 이것을 위해 너겟 패키지 를 만들었습니다 .

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

편집 : 이것은 내 문제가되었습니다.


0

다음은 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)"와 같은 매크로를 사용할 수 있도록 가이드를 제공 합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.