1

您好,
我正在尝试让 subsonic 在sharpdevelop(活动记录方法)中赢得 SQLite。
我在从 T4 模板生成代码时遇到了一些问题。

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

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

错误必须在SQLite.ttincludeSettings.ttinclude中的某个地方, 我已经查看了 ttinclude 文件,但我不知道块或助手是什么。

您对可能导致错误的原因有任何想法吗?显然,mono develop T4 生成器会引发相同的错误,但 Visual Studio 的则不会。

4

3 回答 3

3

很难说它们对 Helper/Block 的含义是什么,因为 Visual Studio T4 将不同的段称为 Statement、Expression、BoilerPlate 和 ClassFeature IIRC。

在检查 Mono T4 的源代码时,我猜想 Block 指的是 Statements 和 Helpers 指的是 ClassFeatures。

T4 示例:

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

确实,语句不能出现在 T4 中的 ClassFeatures 下面,但我认为这里发生的是 Visual Studio T4 对 ttinclude 文件进行“智能”合并。Mono T4 可能没有。

看看为什么要考虑这两个 T4 文件。

示例 T4.tt包括:

<# // 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 的操作

我担心的也不是好消息。

PS。在阅读 Mono 代码时,开发人员似乎考虑了这一点:

//TODO: are blocks permitted after helpers?  
throw new ParserException ("Blocks are not permitted after helpers", seg.StartLocation);   
于 2011-08-21T19:00:00.617 回答
1

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

  1. 将 <#@ include file="SQLServer.ttinclude" #> 声明移动到每个 .tt 文件的末尾。幸运的是,每个 ttinclude 文件只包含 classFeatures

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

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

于 2011-09-18T18:50:05.703 回答
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 namespace="EnvDTE = ICSharpCode.PackageManagement.EnvDTE" #>

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

于 2011-10-03T20:54:40.253 回答