Как остановить выполнение 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 файл, когда вы уходите.