繁体   English   中英

尝试在SharpDevelop中执行亚音速的ActiveRecord时出现T4模板生成错误

[英]T4 template generation error when trying to execute subsonic's activerecord in sharpdevelop

你好,
我正在尝试让亚音速工作在Sharpdevelop(主动记录方法)中赢得SQLite。
从T4模板生成代码时遇到一些问题。

它将引发此错误:

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

该错误必须在我浏览过ttinclude文件的SQLite.ttincludeSettings.ttinclude中的某个位置,但是我不知道什么是块或助手。

您是否对导致错误的原因有任何想法? 显然,单声道开发T4生成器会引发相同的错误,但不会引发Visual Studio的错误。

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

但是,在检查Mono T4的源代码时 ,我会猜到Block是指语句,而Helper是指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" #>

包含的简单实现只需合并文件即可:

<# // 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文件中包含Statements非常方便。
  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);   

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

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

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

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

现在应在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文件以生成数据库访问代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM