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

Когда я редактирую T4, скрипт выполняется каждый раз, когда я переключаюсь на другой файл. Это нормально для простых простых сценариев, но для выполнения некоторых сценариев требуется много времени. Есть ли способ отключить это поведение? Я хочу, чтобы скрипт запускался только при сохранении файла T4 или при выборе вручную "Run Custom Tool" из меню.

5 ответов

Решение

T4 подключен к механизму пользовательского инструмента ( IVsSingleFileGenerator) в системах проектов C#/VB, который позволяет запускать при сохранении, запускать пользовательское меню инструментов, а также поведение переключения по вкладкам - и все это за цену реализации простого интерфейса.

К сожалению, это означает, что T4 также практически не контролирует поведение, которое является стандартом для пользовательских инструментов.

Альтернативой может быть использование поддержки T4 MsBuild в SDK моделирования и визуализации VS для выполнения T4 во время сборки, а затем отключение пользовательского инструмента. Я спрошу у моего коллеги, который создал поддержку msbuild, использует ли он специальный инструмент для определения набора шаблонов или нет, и отправит сообщение обратно в ветку.

У меня была точно такая же проблема. Я следовал инструкциям в этой статье http://msdn.microsoft.com/en-us/library/ee789839.aspx о разделении шаблонов в другом проекте и совместном использовании выходных файлов.

В нем подробно описано, как отключить инструмент TextTemplatingFileGenerator, прикрепленный к шаблону, щелкнув правой кнопкой мыши шаблон и очистив свойство CustomTool. Это останавливает генерирование кода шаблона при сохранении... но он все еще работает при переключении вкладок!

Я думаю, что единственный способ обойти это - переместить весь код вашего шаблона в новый файл с другим суффиксом (например, ttinclude или t4 или что-то в этом роде), а затем включить этот файл в ваш фактический файл шаблона T4 с помощью директивы include. Таким образом, вам никогда не понадобится открывать этот файл для редактирования шаблона, чтобы он не запустился случайно.

Итак, в одном файле с именем MyTemplate.tt:

<#@ template language="VB" debug="false" hostspecific="true"#>
<#@ include file="Include\MyTemplateCodeBehind.t4" #>
<#@ output extension=".vb"#>
<# ' Nothing to see here! #>

В то время как в другом файле с именем MyTemplateCodeBehind.t4:

<#@ template language="VB" debug="false" hostspecific="true"#>
<#
   For Each something In somecollection
#>
   <#= something.PrintMyCode() #>
<#
   Next

#>

То, что я делаю (вероятно, плохой метод), пишет в начале файла t t строку исключения, например:

<# throw new Exception(); #>

Поскольку я выбрасываю исключение, процесс останавливается, и когда я заканчиваю всю работу, мне просто нужно удалить эту строку.:)

Я счел полезным при разработке шаблона T4 использовать следующий фрагмент кода в верхней части файла T4:

<# //throw exception to halt execution during development
    throw new Exception();
#>

Если при сохранении T4 есть ошибки, они будут отображаться, в противном случае отобразится сообщение:

Ошибка при выполнении преобразования: System.Exception: возникло исключение типа "System.Exception".

Затем закомментируйте исключение, когда вы будете готовы фактически сгенерировать вывод T4.

Попробуйте сразу после директив компиляции, добавьте метод return to exit

<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ include file="EF6.Utility.CS.ttinclude"#><#@ 
 output extension="Repository.cs"#><#
return string.Empty;     //<-- add this line!!! 

...

Шаблоны T4 выполняются при сохранении файла. Если у вас есть настройки VS для автоматического сохранения, когда вы уходите от файла, который может объяснить поведение. Просмотрите конфигурацию VS, чтобы определить, сохраняет ли VS файл, когда вы уходите.

Другие вопросы по тегам