Ошибка генерации шаблона T4 при попытке выполнить активную запись subsonic в sharpdevelop - PullRequest
1 голос
/ 21 августа 2011

Здравствуйте,
Я пытаюсь настроить дозвуковую работу win SQLite в sharpdevelop (подход с активной записью).
У меня возникли некоторые проблемы с генерацией кода из шаблонов T4.

Выдает эту ошибку: Блоки не разрешены после помощников - SQLiteTest.tt

Если я удаляю строку <#@ include file="SQLite.ttinclude" #>, она больше не выдает ошибку, но, конечно, это нене работает.

Ошибка должна быть где-то в SQLite.ttinclude или Settings.ttinclude Я просматривал файлы ttinclude, но не знаю, чтоблоки или помощники.

Есть ли у вас какие-либо идеи о том, что может быть причиной ошибки?Очевидно, моно-генератор T4 выдает ту же ошибку, но не Visual Studio.

Ответы [ 3 ]

3 голосов
/ 21 августа 2011

Сложно сказать, что они имеют в виду под Helper / Block, поскольку Visual Studio T4 называет различные сегменты как Statement, Expression, BoilerPlate и ClassFeature IIRC.

При проверке исходного кода для Mono T4, однако, я бы предположил, что Block относится к операторам, а помощники относятся к ClassFeatures.

Пример T4:

<# // This is a Statement #>
<#+ // This is a ClassFeature #>

Это правда, что операторы не могут появляться ниже ClassFeatures в T4но я думаю, что здесь происходит то, что Visual Studio T4 выполняет «умное» объединение файлов ttinclude.Возможно, что Mono T4 нет.

Чтобы понять, почему рассмотрим эти два файла T4.

Пример T4.ttinclude:

<# // 1. This is a Statement #>
<#+ // 1. This is a ClassFeature #>

Пример T4.tt

<# // 2. This is a Statement #>
<#+ // 2. This is a ClassFeature #>
<#@ include file="T4.ttinclude" #>

Простойреализация include просто объединит файл:

<# // 2. This is a Statement #>
<#+ // 2. This is a ClassFeature #>
<# // 1. This is a Statement #>
<#+ // 1. This is a ClassFeature #>

Но это недопустимый шаблон T4, так что Visual Studio T4 делает (насколько мне известно) объединение файлов в это, что является законным:

<# // 1. This is a Statement #>
<# // 2. This is a Statement #>
<#+ // 1. This is a ClassFeature #>
<#+ // 2. This is a ClassFeature #>

Так что, если мне позволят догадаться, Mono T4 включает в себя файл с использованием простого подхода, но шаблоны SubSonic предназначены для Visual Studio T4, в которой используется немного более изощренная стратегия включения.

ЕслиПо этой причине вам нужно

  1. Refactor SQLLite.ttinclude или Settings.ttinclude, чтобы использовать только ClassFeatures.Это, вероятно, серьезный рефакторинг, поскольку наличие операторов в файле .ttinclude очень удобно.
  2. Рефакторинг Mono T4 для создания чего-то похожего на Visual Studio T4

Боюсь, что и хороших новостей нет..

PS.При чтении кода Mono кажется, что разработчик учел это:

//TODO: are blocks permitted after helpers?  
throw new ParserException ("Blocks are not permitted after helpers", seg.StartLocation);   
1 голос
/ 04 октября 2011

Эта проблема теперь должна быть исправлена ​​в SharpDevelop 4.2.Функциональные блоки класса, которые добавляются путем добавления других файлов T4, теперь поддерживаются.SharpDevelop также теперь представляет свою собственную реализацию объектной модели Visual Studio с хоста шаблонов T4.В шаблонах Subsonic для определения строки подключения к базе данных используется объектная модель Visual Studio.

Для работы шаблонов Subsonic необходимо внести две модификации в файл Settings.include:

Замените ссылку на сборку объектной модели Visual Studio (EnvDTE):

<#@ assembly name="EnvDTE" #>

На:

<#@ assembly name="$(addinpath:ICSharpCode.PackageManagement)PackageManagement.dll" #>

Добавьте директиву импорта с псевдонимом пространства имен для EnvDTE:

<#@ import namespace="EnvDTE = ICSharpCode.PackageManagement.EnvDTE" #>

Сохраните эти изменения, а затем сохраните файл ActiveRecord.tt для создания кода доступа к базе данных.

1 голос
/ 18 сентября 2011

Я тоже столкнулся с этой проблемой, однако решение было простым.

  1. Переместите объявление <# @ include file = "SQLServer.ttinclude" #> в конец каждого файла .tt. К счастью, каждый файл ttinclude содержит только classFeatures

  2. Затем вам нужно провести рефакторинг нескольких функций, основанных на EvnDTE (которого нет в моно). Это легко сделать, так как эти функции возвращают только пути проекта. Этими функциями являются GetProjectPath, GetConfigPath и GetDataDirectory. Я просто переписал их, чтобы вернуть Consts, которые объявлены в заголовке файла. Не так элегантно, как автоопределение, но достаточно прост в управлении.

После этих двух вещей я смог успешно запустить шаблоны Subsonic T4.

...