如何自动化SubSonic的t4代码生成

时间:2010-02-24 11:00:10

标签: subsonic3 nant t4 subsonic-active-record

我正在使用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。 C:\ Users \ matt.roberts \ AppData \ Loc中的GeneratedTextTransformation.GetCurrentProject() al \ Temp \ subsonic \ Settings.ttinclude:第103行    在Microsoft.VisualStudio.TextTemplating3d54bbced2424853b667e74a81b9089b。 c:\ U中的GeneratedTextTransformation.GetConnectionString(String connectionStringName) sers \ matt.roberts \ AppData \ Local \ Temp \ subsonic \ Settings.ttinclude:第51行    在Microsoft.VisualStudio.TextTemplating3d54bbced2424853b667e74a81b9089b。 C:\ Users \ matt.roberts \ AppData \中的GeneratedTextTransformation.get_ConnectionString() Local \ Temp \ subsonic \ Settings.ttinclude:第87行

有没有人设法自动化这一代?

由于

2 个答案:

答案 0 :(得分:4)

我写了一篇博客文章,有点涵盖了这一点:

Options for running T4 templates from .NET code

要做你想做的事,需要对SubSonic T4模板进行一些手术。具体来说,您必须(最低限度)将所有对EnvDTE.DTE的引用替换为不需要运行Visual Studio的内容。这可能就像将一些路径和/或配置信息硬编码到T4模板中一样简单,如果你想“让它工作”。

重要的是要记住,T4模板是.NET代码的一个有点薄的包装器。如果你可以从.NET做到这一点,你很可能从T4开始,你只需要了解如何在T4提供的不同约束条件下工作。不同的T4“主机”(如Visual Studio与TextTransform.exe)的行为方式不同,只是因为T4模板在一台主机下运行良好并不意味着它可以在另一台主机下正常运行。

答案 1 :(得分:1)

setting.ttinclude需要在visual studio的项目中运行,如果你想从命令行运行,你必须给设置文件提供连接字符串,而不是在配置文件中指向它,你可能还有设置项目路径。

你知道它叫这个:

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

    string result="";
    ExeConfigurationFileMap configFile = new ExeConfigurationFileMap();
    configFile.ExeConfigFilename = GetConfigPath();
那可能是问题所在的地方,所以如果你手动设置这些,那么你可以解决oproblem