尝试在sharpdevelop中执行subsonic的activerecord时出现T4模板生成错误

时间:2011-08-21 11:02:59

标签: c# sqlite activerecord t4 sharpdevelop

您好,
我正试图通过sharpdevelop(主动记录方法)获得亚音速来赢得SQLite 我在使用T4模板生成代码时遇到了一些问题。

它抛出此错误: 帮助程序后不允许使用块 - SQLiteTest.tt

如果我删除了 <#@ include file="SQLite.ttinclude" #>行 它不再抛出错误,但当然它不起作用。

错误必须位于 SQLite.ttinclude Settings.ttinclude 中的某处 我查看了ttinclude文件,但我不知道是什么块或帮助器。

您是否知道可能导致错误的原因是什么? 显然,单色开发T4生成器会抛出相同的错误,但不会引发Visual Studio的错误。

3 个答案:

答案 0 :(得分:3)

有点难以说出Helper / Block的含义,因为Visual Studio T4将不同的段称为Statement,Expression,BoilerPlate和ClassFeature IIRC。

在检查Mono T4的source code时,我会猜测Block引用语句,Helpers引用ClassFeatures。

T4示例:

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

确实,语句不能出现在T4中的ClassFeatures下面,但我在想的是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. 重构SQLLite.ttinclude或Settings.ttinclude仅使用ClassFeatures。这可能是一个重大的重构,因为在.ttinclude文件中使用语句非常方便。
  2. 重构Mono T4以执行与Visual Studio T4类似的操作
  3. 我担心这两个消息都不是好消息。

    PS。在阅读Mono代码时,开发人员似乎认为:

    //TODO: are blocks permitted after helpers?  
    throw new ParserException ("Blocks are not permitted after helpers", seg.StartLocation);   
    

答案 1 :(得分:1)

我也遇到了这个问题,但解决方案很简单。

  1. 移动&lt;#@ include file =“SQLServer.ttinclude”#&gt;声明到每个.tt文件的末尾。幸运的是,每个ttinclude文件只包含classFeatures

  2. 然后你需要重构一些依赖于EvnDTE的功能(单声道中不存在)。这很简单,因为这些函数只返回项目路径。这些函数是GetProjectPath,GetConfigPath和GetDataDirectory。我只是重写了这些以返回在文件头部声明的Consts。不像自动检测那么优雅,但足够简单管理。

  3. 完成这两件事之后,我能够成功运行Subsonic T4模板。

答案 2 :(得分:1)

现在应该在SharpDevelop 4.2中修复此问题。现在支持通过包含其他T4文件添加的类功能块。 SharpDevelop现在还从T4模板主机公开了自己的Visual Studio对象模型实现。 Subsonic模板使用Visual Studio对象模型来确定数据库连接字符串。

要使Subsonic模板正常工作,您需要对Settings.include文件进行两处修改:

替换对Visual Studio对象模型程序集(EnvDTE)的引用:

<#@ assembly name="EnvDTE" #>

使用:

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

为EnvDTE添加带有命名空间别名的import指令:

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

保存这些更改,然后保存ActiveRecord.tt文件以生成数据库访问代码。