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

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

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

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

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

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

Ответы [ 20 ]

68 голосов
/ 01 августа 2010

Я согласен с GarethJ - в VS2010 намного проще восстанавливать шаблоны tt при каждой сборке Блог Олега Сыча описывает, как это сделать. Короче говоря:

  1. Установка Visual Studio SDK
  2. Установить Visual Studio 2010 Modeling и визуализация 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" />
68 голосов
/ 15 июня 2010

Я использовал ответ Джоэл Фана, чтобы придумать это. Мне это нравится больше, потому что вам не нужно помнить об изменении события перед сборкой каждый раз, когда вы добавляете новый файл .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
29 голосов
/ 18 июня 2014

Существует отличный пакет NuGet, который делает именно это:

PM> Install-Package Clarius.TransformOnBuild

Подробности о пакете можно найти здесь

20 голосов
/ 03 ноября 2009

Я использовал ответ MarkGr и разработал это решение. Сначала создайте пакетный файл с именем RunTemplate.bat в отдельной папке tools над основной папкой решения. Пакетный файл просто имеет строку:

"%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, указанным в шаблоне директивами Assembly .

Далее перейдите в Project Properties проекта, содержащего шаблон T4. Перейдите в События сборки и добавьте следующую Командную строку события перед сборкой :

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

замена MyTemplate именем вашего файла .tt (т.е. MyTemplate.tt) без расширения .tt. Это приведет к расширению шаблона для создания MyTemplate.cs перед сборкой проекта. Тогда фактическая сборка скомпилирует MyTemplate.cs

14 голосов
/ 07 августа 2010

Недавно нашёл этот замечательный плагин VS, Chirpy .

Мало того, что он генерирует ваш T4 при сборке, он также позволяет использовать основанный на T4 подход к минимизации JavaScript, CSS и даже позволяет использовать синтаксис LESS для вашего CSS!

13 голосов
/ 16 сентября 2014

Вероятно, самый простой способ - установить расширение Visual Studio под названием AutoT4 .

Он автоматически запускает все шаблоны T4 при сборке.

12 голосов
/ 05 апреля 2013

Предварительная сборка может быть уменьшена до одной строки:

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 отличается.

9 голосов
/ 02 ноября 2009

Выезд C: \ Program Files (x86) \ Общие файлы \ Microsoft Shared \ TextTemplating там есть преобразование exe командной строки. Либо напишите задачу MSBuild с пользовательским хостом и выполните преобразование самостоятельно.

7 голосов
/ 15 марта 2014

Расширяя ответы Сет Рено и Джоэля Фана, я придумал это. С этим решением не нужно помнить, что нужно изменять событие перед сборкой каждый раз, когда вы добавляете новый файл .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)

6 голосов
/ 05 июня 2010

Если вы используете Visual Studio 2010, вы можете использовать Visual Studio SDK для моделирования и визуализации: http://code.msdn.microsoft.com/vsvmsdk

Содержит задачи msbuild для выполнения шаблонов T4 во время сборки.

Загляните в блог Олега для более подробного объяснения: http://www.olegsych.com/2010/04/understanding-t4-msbuild-integration

...