2 (3) вопроса о шаблонах T4, получении имени обрабатываемого первичного файла и возможности завершения обработки - PullRequest
3 голосов
/ 07 ноября 2010

Я пытаюсь создать свой собственный DSL для проекта, и я хотел бы создать один файл T4, который содержит основной механизм для этого, а затем создать небольшие файлы T4, который включает этот механизм и вызывает его.

Я думал о попытке этого формата для файлов T4, которые будут запускать движок:

<#@ include file="EngineLib\EngineLib.tt" #>
<# RunEngine(); #>
dsl goes here

У меня есть три вопроса:

1. Могу ли я получить имя основного скрипта?

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

2. Могу ли я закончить обработку скрипта?

Например, внутри метода RunEngine(), если первый вопрос дает ответ, я прочитал бы оригинальный сценарий, удалил первые строки, содержащие директивы T4, а затем обработал остальную часть файла в соответствии с моими правилами DSL. .

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

Это имело смысл?

Предположим, что RunEngine просто выводит класс, если я не могу прекратить обработку, вот как будет выглядеть сгенерированный файл:

public class SomeClass
{
}
dsl goes here

Очевидно, я не хочу, чтобы код DSL был частью моего сгенерированного вывода.

3. Я лаю не на том дереве?

Я знаю, что не могу включить код, подобный T4, в DSL, так как в итоге он будет скомпилирован в код, который будет выполняться как часть обработки T4, но в этом случае это не будет проблемой.

Что-нибудь еще, о чем я не подумал, может пойти не так?

1 Ответ

5 голосов
/ 15 ноября 2010
  1. Чтобы получить имя скрипта, используйте Host.TemplateFile. Чтобы сделать хост доступным, добавьте свойство hostspecific в заголовок:

    <#@ template language="C#v3.5" hostspecific="true" debug="true" #>
    
  2. Чтобы остановить обработку скрипта, вы можете использовать оператор return. Очевидно, что нет способа сделать это внутри другой функции, вы должны сделать это внутри <# #> скобок.

    <# return GenerationEnvironment.ToString(); #>
    
  3. То, чего вы пытаетесь достичь, обычно делается с использованием двух отдельных файлов: сценария T4 и файла данных, который он использует в качестве источника. Чтобы скрипт обновлял созданный файл при изменении файла данных, а также для создания нескольких файлов из одного сценария T4, вы можете использовать T4Toolbox.

...