Получить Visual Studio для запуска шаблона T4 на каждой сборке - PullRequest
157 голосов
/ 30 октября 2009

Как мне получить шаблон T4 для генерации выходных данных при каждой сборке? Как и сейчас, он регенерирует его только когда я изменяю шаблон.

Я нашел другие вопросы, похожие на это:

Порядок преобразования и сборки T4 в Visual Studio (без ответа)

Как получить файлы t4 для сборки в visual studio? (ответы недостаточно подробны [хотя и достаточно сложны] и даже не имеют общего смысла)

Должен быть более простой способ сделать это!

Ответы [ 20 ]

4 голосов
/ 25 ноября 2010

Эй, Мой скрипт также может анализировать расширение вывода

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 голосов
/ 03 мая 2013

Dynamo.AutoTT сделает то, что вам нужно. Вы можете настроить его для просмотра файлов через регулярные выражения или генерировать при сборке. Это также позволяет вам указать, какие шаблоны T4 вы хотите запускать.

Вы можете скачать его здесь: https://github.com/MartinF/Dynamo.AutoTT

Просто соберите его, скопируйте файлы dll и AddIn в

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

и уходи.

Если вы хотите запустить его в VS2012, вам нужно изменить файл Dynamo.AutoTT.AddIn и установить для версии значение 11.0 в файле AddIn;

1 голос
/ 10 мая 2019

T4Executer делает это для VS2019. Вы можете указать шаблоны, которые будут игнорироваться при сборке, и есть опция выполнения после сборки.

1 голос
/ 24 марта 2016

Вот как я это сделал. Link . Основываясь на отличном блоге (blogs.clariusconsulting.net/kzu/how-to-transform-t4-templates-on-build-without-install-a-visual-studio-sdk/ не может публиковать более 2 ссылки :() Я придумал этот .targets файл для использования с файлами Visual Studio Proj.

Это полезно, когда вы используете другие dll-ы внутри вашего .tt и хотите, чтобы результат менялся по мере изменения dll-ов.

Как это работает:

  1. Создайте tt, добавьте путь сборки name = "$ (SolutionDir) \ в \ 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-ов.

Вы можете удалить пользовательский инструмент (из свойств внутри Visual Studio), чтобы VS не пытался каждый раз трансформироваться и терпеть неудачу. Потому что мы удалили ссылки на сборки в шаге 2

1 голос
/ 29 апреля 2014

В Visual Studio 2013 щелкните правой кнопкой мыши шаблон T4 и установите для свойства transform on build значение true.

1 голос
/ 28 марта 2014

Вам просто нужно добавить эту команду в событие предварительной сборки проекта:

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

Проверка конфигурации = отладка гарантирует, что вы не будете заново генерировать код в режиме выпуска, например, при сборке на сервере сборки TFS.

1 голос
/ 20 сентября 2013

Вот мое решение - похоже на принятый ответ. У нас была проблема с нашим контролем версий. Целевые файлы .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

Вы можете попытаться добавить команду извлечения в строке (:: Вы можете попробовать ....)

В вашем проекте установите это как действие предварительной сборки:

Path-To-Transform.bat "$(ProjectDir)"
0 голосов
/ 21 июня 2019

В Visual Studio 2017 (возможно, и в следующих версиях) вы должны добавить это в событие Pre-build:

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

p.s. Измените путь к шаблону, если он не находится в корневом каталоге проекта.

0 голосов
/ 16 мая 2019

Вы просто устанавливаете пакет NuGet: Clarius.TransformOnBuild

Затем, каждый раз, когда вы нажимаете Перестроить проект (или решение), ваши .tt файлы будут запускаться

0 голосов
/ 25 сентября 2015

Какой-то парень создал для этого пакет nuget .

Примечание: я получаю ошибки компиляции как от TextTemplate.exe, так и от этого пакета (поскольку этот пакет вызывает TextTemplate.exe), но не от Visual Studio. Итак, по-видимому, поведение не то же самое; возглавляет.

РЕДАКТИРОВАТЬ: Это оказалось моей проблемой.

...