Я пытаюсь создать свой собственный 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, но в этом случае это не будет проблемой.
Что-нибудь еще, о чем я не подумал, может пойти не так?