Как я могу автоматизировать генерацию кода t4 для SubSonic - PullRequest
2 голосов
/ 24 февраля 2010

Я использую SubSonic 3 (режим ActiveRecord) для генерации кода для моего DAL.Он использует файлы шаблонов T4 (.tt), которые, как только вы сохраняете, генерируют код для вас.

Я хочу автоматизировать это как часть моей сборки NANT, но не могу заставить это работать.Я знаю, что MS предоставляет инструмент TextTransform для генерации кода из шаблонов T4, но в случае шаблонов SubSonic это, похоже, не работает - я думаю, что шаблоны делают некоторые предположения относительно запуска шаблона из Visual Studio,который, кажется, не работает из командной строки.Ошибка, которую я получаю при попытке запустить файл ActiveRecord.tt:

Subsonic \ ActiveRecord.tt (0,0): ошибка: выполняется преобразование: System.InvalidCastException: невозможно преобразовать объект типа 'Microsoft.VisualStudio.TextTemplating.CommandLine.CommandLineHost 'для ввода' System.IServiceProvider '.в Microsoft.VisualStudio.TextTemplating3d54bbced2424853b667e74a81b9089b.GeneratedTextTransformation.GetCurrentProject () в c: \ Users \ matt.roberts \ AppData \ Loc al \ Temp \ subsonic \ Settings.ttinclude: строка 103 в Microsoft.VisualStudio.TextTemplating3d54bbced2424853b667e74a81b9089b.GeneratedTextTransformation.GetConnectionString (String connectionStringName) в каталоге c: \ U sers \ matt.roberts \ AppData \ Local \ Temp \ subsonic \ Settings.ttinclude: строка 51 в Microsoft.VisualStudio.TextTemplating3d54bbced2424853b667e74a81b89.GeneratedTextTransformation.get_ConnectionString () в c: \ Users \ matt.roberts \ AppData \ Local \ Temp \ subsonic \ Settings.ttinclude: строка 87

Кому-нибудь удалось автоматизировать это поколение?

Спасибо

Мэтт.

Ответы [ 2 ]

4 голосов
/ 02 марта 2010

Я написал запись в блоге, которая несколько охватывает эту тему:

Параметры запуска шаблонов T4 из кода .NET

Чтобы сделать то, что вы пытаетесь сделать, потребуются некоторые операции с шаблонами SubSonic T4. В частности, вам придется (как минимум) заменить все ссылки на EnvDTE.DTE на то, что не требует запуска Visual Studio. Это может быть так же просто, как жесткое кодирование некоторых путей и / или информации о конфигурации в ваши шаблоны T4, если вы хотите просто «заставить его работать».

Важно помнить, что шаблоны T4 являются довольно тонкой оболочкой для кода .NET. Если вы можете сделать это из .NET, вы можете сделать это из T4, вам просто нужно понять, как работать в рамках другого набора ограничений, которые обеспечивает T4. Различные «хосты» T4 (такие как Visual Studio и TextTransform.exe) ведут себя по-разному, и только то, что шаблон T4 работает нормально на одном хосте, не означает, что он будет работать на другом хосте.

1 голос
/ 27 февраля 2010

setting.ttinclude необходимо запустить внутри проекта Visual Studio. Если вы хотите запустить из командной строки, вам нужно будет указать в файле настроек строку подключения, а не указывать на нее в файлах конфигурации, вы также можете иметьчтобы задать путь к проекту.

вы видите, что он вызывает это:

string GetConnectionString(string connectionStringName){
    var _CurrentProject = GetCurrentProject();

    string result="";
    ExeConfigurationFileMap configFile = new ExeConfigurationFileMap();
    configFile.ExeConfigFilename = GetConfigPath();

Возможно, именно в этом и заключается проблема, поэтому, если вы установите их вручную, то проблема может быть решена

...