Когда я редактирую T4, script выполняется каждый раз при переключении на другой файл. Это нормально для быстрых простых скриптов, но для выполнения некоторых сценариев требуется много времени. Есть ли способ отключить это поведение? Я хочу, чтобы script запускался только тогда, когда я сохраняю файл T4 или вручную выбираю "Запустить пользовательский инструмент" в меню.
Как остановить выполнение T4 при каждом переключении на другую вкладку?
Ответ 1
T4 подключается к механизму настраиваемого инструмента (IVsSingleFileGenerator) в системах проекта С#/VB, что дает ему пробег в сохранении, запустить меню пользовательских инструментов, а также запустить режим переключения вкладок - все это за цену реализации простого интерфейса.
К сожалению, это означает, что T4 также по существу не контролирует эти поведения, которые являются стандартом для настраиваемых инструментов.
Альтернативой может быть использование поддержки T4 MsBuild в VS Modeling и Visualization SDK для выполнения T4 во время сборки, а затем отключить настраиваемый инструмент. Я спрошу у своего коллеги, который построил поддержку msbuild, если он использует настраиваемый инструмент, чтобы идентифицировать набор шаблонов или нет и отправить обратно в поток.
Ответ 2
У меня была такая же проблема. Я выполнил шаги в этой статье http://msdn.microsoft.com/en-us/library/ee789839.aspx о разделении шаблонов на другой проект и совместном использовании выходных файлов.
Подробности о том, как отключить инструмент TextTemplatingFileGenerator, прикрепленный к шаблону, щелкнув правой кнопкой мыши шаблон и очистив свойство CustomTool. Это останавливает создание кода генерации шаблона при сохранении... но STILL RUNS при переключении вкладок!
Я думаю, что единственный способ обойти это - переместить весь ваш шаблонный код в новый файл с другим суффиксом (например, 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
#>
Ответ 3
То, что я делаю (возможно, плохой метод), записывает в начале tt файла строку исключения, например:
<# throw new Exception(); #>
Поскольку я бросаю исключение, процесс останавливается, и когда я заканчиваю всю работу, мне просто нужно удалить эту строку.:)
Ответ 4
Попробуйте сразу после директив компиляции, добавьте метод возврата к выходу
<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ include file="EF6.Utility.CS.ttinclude"#><#@
output extension="Repository.cs"#><#
return string.Empty; //<-- add this line!!!
...
Ответ 5
Шаблоны T4 выполняются при сохранении файла. Если у вас есть настройка VS для автоматического сохранения, когда вы уходите от файла, который мог бы объяснить поведение. Просмотрите конфигурацию VS, чтобы определить, сохраняет ли VS файл, когда вы уходите.