[英]Why does SubSonic's ActiveRecord T4 template generate ActiveRecord1.cs and not ActiveRecord.cs?
[英]T4 template generation error when trying to execute subsonic's activerecord in sharpdevelop
你好,
我正在尝试让亚音速工作在Sharpdevelop(主动记录方法)中赢得SQLite。
从T4模板生成代码时遇到一些问题。
它将引发此错误:
如果删除<#@ include file="SQLite.ttinclude" #>
行,它将不再抛出错误,但是当然不起作用。
该错误必须在我浏览过ttinclude文件的SQLite.ttinclude或Settings.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设计的,它使用了稍微完善的包含策略。
如果这是原因,您将需要
我担心这也不是好消息。
PS。 在阅读Mono代码时,开发人员似乎考虑了这一点:
//TODO: are blocks permitted after helpers?
throw new ParserException ("Blocks are not permitted after helpers", seg.StartLocation);
我也遇到了这个问题,但是解决方案很简单。
将<#@ include file =“ SQLServer.ttinclude”#>声明移到每个.tt文件的末尾。 幸运的是,每个ttinclude文件仅包含classFeatures
然后,您需要重构一些依赖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.