代码之家  ›  专栏  ›  技术社区  ›  Matt Roberts

如何自动生成用于亚音速的t4代码

  •  2
  • Matt Roberts  · 技术社区  · 15 年前

    我正在使用亚音速3(ActiveRecord模式)为我的DAL生成代码。它使用T4模板(.tt)文件,保存后立即为您生成代码。

    我想将此自动化作为我的nant构建的一部分,但我无法使其工作。我知道MS提供了一个名为textform的工具来从t4模板生成代码,但在亚音速模板的情况下,这似乎不起作用-我认为模板对在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行 位于C:\U中的Microsoft.VisualStudio.TextTemplating3d54bbced2424853b667e74a81b9089b.GeneratedTextTransformation.getConnectionString(String ConnectionStringName) sers\matt.roberts\appdata\local\temp\subsonic\settings.ttinclude:第51行 位于Microsoft.VisualStudio.TextTemplating3d54bbced2424853b667e74a81b9089b.GeneratedTextTransformation.get_ConnectionString()in C:\Users\Matt.Roberts\AppData\ local\temp\subsonic\settings.ttinclude:第87行

    是否有人能够实现这一代的自动化?

    谢谢

    马特。

    2 回复  |  直到 15 年前
        1
  •  4
  •   Michael Maddox    15 年前

    我写了一篇博文,在一定程度上涵盖了这一点:

    Options for running T4 templates from .NET code

    要做你想做的事情,需要对亚音速T4模板进行一些手术。具体来说,您必须(至少)用不需要运行Visual Studio的东西替换对envdte.dte的所有引用。如果您只想“让它工作”,这可能和将一些路径和/或配置信息硬编码到T4模板中一样简单。

    重要的是要记住,t4模板是一个围绕.NET代码的薄包装器。如果你能在.NET上做,你很可能在T4上做,你只需要了解如何在T4提供的不同约束集合内工作。不同的t4“主机”(如Visual Studio和TextTransform.exe)以不同的方式工作,仅仅因为t4模板在一台主机下运行良好并不意味着它在另一台主机下运行良好。

        2
  •  1
  •   davethecoder    15 年前

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

    你看到它叫这个:

    string GetConnectionString(string connectionStringName){
        var _CurrentProject = GetCurrentProject();
    
        string result="";
        ExeConfigurationFileMap configFile = new ExeConfigurationFileMap();
        configFile.ExeConfigFilename = GetConfigPath();
    

    这可能就是问题的根源所在,所以如果你用手设置这些,那么你的问题就可以解决了。