如何使用 Tangible Editor 从单个 T4 模板创建多个输出文件?
How to create multiple output files from a single T4 template using Tangible Editor?
我尝试按照本教程进行操作:http://t4-editor.tangible-engineering.com/blog/how-to-generate-multiple-output-files-from-a-single-t4-template.html
与 visual studio 2015 (.Net 4.5)
有错误的示例项目:http://www.filedropper.com/t4fail
我使用以下来源创建了 Template1.tt:
<#@ include file="TemplateFileManagerV2.1.ttinclude" #>
<#@ Assembly Name="System.Core" #>
<#@ Assembly Name="System.Windows.Forms" #>
<#@ import namespace="System" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Diagnostics" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Collections" #>
<#@ import namespace="System.Collections.Generic" #>
<#
var manager = TemplateFileManager.Create(this);
#>
我将 TemplateFileManagerV2.1.ttinclude
从模板库添加到我的项目中。
然后我得到一个错误:
'Microsoft.VisualStudio.TextTemplating.IDebugTextTemplatingEngine' is
defined in an assembly that is not referenced. You must add a
reference to assembly
'Microsoft.VisualStudio.TextTemplating.Interfaces.11.0,
Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
所以我添加了对
的引用
C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.VisualStudio.TextTemplating.11.0\v4.0_11.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.TextTemplating.11.0.dll
和
C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.VisualStudio.TextTemplating.Interfaces.11.0\v4.0_11.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.TextTemplating.Interfaces.11.0.dll
到我的项目,但没有任何改变。
错误在下面的方法里面.ttinclude
public string GetTemplateContent(string templateName, TextTemplatingSession session)
{
string fullName = this.Host.ResolvePath(templateName);
string templateContent = File.ReadAllText(fullName);
var sessionHost = this.Host as ITextTemplatingSessionHost;
sessionHost.Session = session;
Engine engine = new Engine();
return engine.ProcessTemplate(templateContent, this.Host);
}
我换成了
public string GetTemplateContent(string templateName, TextTemplatingSession session)
{
string fullName = this.Host.ResolvePath(templateName);
string templateContent = File.ReadAllText(fullName);
var sessionHost = this.Host as ITextTemplatingSessionHost;
sessionHost.Session = session;
//Engine engine = new Engine();
return "";//engine.ProcessTemplate(templateContent, this.Host);
}
检查问题是否确实在dll中得到:
'Microsoft.VisualStudio.TextTemplatingA30AC8B57EFC4307E43667FCD72F5E4857F498C5224AE0D43FFC74B3A98D4FA090794EF196648D62B1BC664AFBA5EDE831067D7D1768A759EBBE83426975F7AA.GeneratedTextTransformation'
does not contain a definition for 'Host' and no extension method
'Host' accepting a first argument of type
'Microsoft.VisualStudio.TextTemplatingA30AC8B57EFC4307E43667FCD72F5E4857F498C5224AE0D43FFC74B3A98D4FA090794EF196648D62B1BC664AFBA5EDE831067D7D1768A759EBBE83426975F7AA.GeneratedTextTransformation'
could be found (are you missing a using directive or an assembly
reference?)
好像不是。
<#@ template hostSpecific="true"#>
在 .tt
文件之上解决所有问题。
我记得我在 2010 年找到了一种更简单的方法,但现在在网上查找该方法后,我再也找不到了。因此,经过一番挖掘,我设法在一个旧的源代码存储库中找到了它。这是我当时的做法,没有使用任何外部文件或依赖项:
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System" #>
<#@ import namespace="System.IO" #>
<#@ output extension=".txt" #>
<#
for (Int32 i = 0; i < 10; ++i) {
#>
Content <#= i #>
<#
// End of file.
SaveOutput("Content" + i.ToString() + ".txt");
}
#>
<#+
private void SaveOutput(string outputFileName) {
string templateDirectory = Path.GetDirectoryName(Host.TemplateFile);
string outputFilePath = Path.Combine(templateDirectory, outputFileName);
File.WriteAllText(outputFilePath, this.GenerationEnvironment.ToString());
this.GenerationEnvironment.Remove(0, this.GenerationEnvironment.Length);
}
#>
请注意,我不知道这个方法的原作者是谁。如果你恰好知道他或她是谁,欢迎留言。
这是 Tangible Engineering 的文档:
它要求您包含并使用模板文件管理器。步骤简述如下:
- 从他们的免费代码库中获取文件管理器 (https://t4-editor.tangible-engineering.com/Download_T4Editor_Plus_ModelingTools.html)
- 在主模板文件中包含文件管理器:
<#@ include file="TemplateFileManagerV2.1.ttinclude" #>
- 实例化管理器:
<# var manager = TemplateFileManager.Create(this); #>
- 使用管理器启动一个新文件:
<# manager.StartNewFile("Outputfile2.txt"); #>
请注意,这将在开始下一个文件之前结束先前启动的文件。
- 正常生成模板代码(将在新文件中生成,直到启动另一个文件或下面处理文件)
- 完成所有文件(将结束之前启动的文件):
<# manager.Process(); #>
此外,此方法会自动将新文件添加到项目中。
更新 -- 包含图片
第 1 部分:生成多个输出文件
创建模板
包括模板库中的可重复使用的模板管理器
测试输出到多个文件
第 2 部分:不同项目中的多个输出文件
我尝试按照本教程进行操作:http://t4-editor.tangible-engineering.com/blog/how-to-generate-multiple-output-files-from-a-single-t4-template.html
与 visual studio 2015 (.Net 4.5)
有错误的示例项目:http://www.filedropper.com/t4fail
我使用以下来源创建了 Template1.tt:
<#@ include file="TemplateFileManagerV2.1.ttinclude" #>
<#@ Assembly Name="System.Core" #>
<#@ Assembly Name="System.Windows.Forms" #>
<#@ import namespace="System" #>
<#@ import namespace="System.IO" #>
<#@ import namespace="System.Diagnostics" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Collections" #>
<#@ import namespace="System.Collections.Generic" #>
<#
var manager = TemplateFileManager.Create(this);
#>
我将 TemplateFileManagerV2.1.ttinclude
从模板库添加到我的项目中。
然后我得到一个错误:
'Microsoft.VisualStudio.TextTemplating.IDebugTextTemplatingEngine' is defined in an assembly that is not referenced. You must add a reference to assembly 'Microsoft.VisualStudio.TextTemplating.Interfaces.11.0, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.
所以我添加了对
的引用C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.VisualStudio.TextTemplating.11.0\v4.0_11.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.TextTemplating.11.0.dll
和
C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.VisualStudio.TextTemplating.Interfaces.11.0\v4.0_11.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.TextTemplating.Interfaces.11.0.dll
到我的项目,但没有任何改变。
错误在下面的方法里面.ttinclude
public string GetTemplateContent(string templateName, TextTemplatingSession session)
{
string fullName = this.Host.ResolvePath(templateName);
string templateContent = File.ReadAllText(fullName);
var sessionHost = this.Host as ITextTemplatingSessionHost;
sessionHost.Session = session;
Engine engine = new Engine();
return engine.ProcessTemplate(templateContent, this.Host);
}
我换成了
public string GetTemplateContent(string templateName, TextTemplatingSession session)
{
string fullName = this.Host.ResolvePath(templateName);
string templateContent = File.ReadAllText(fullName);
var sessionHost = this.Host as ITextTemplatingSessionHost;
sessionHost.Session = session;
//Engine engine = new Engine();
return "";//engine.ProcessTemplate(templateContent, this.Host);
}
检查问题是否确实在dll中得到:
'Microsoft.VisualStudio.TextTemplatingA30AC8B57EFC4307E43667FCD72F5E4857F498C5224AE0D43FFC74B3A98D4FA090794EF196648D62B1BC664AFBA5EDE831067D7D1768A759EBBE83426975F7AA.GeneratedTextTransformation' does not contain a definition for 'Host' and no extension method 'Host' accepting a first argument of type 'Microsoft.VisualStudio.TextTemplatingA30AC8B57EFC4307E43667FCD72F5E4857F498C5224AE0D43FFC74B3A98D4FA090794EF196648D62B1BC664AFBA5EDE831067D7D1768A759EBBE83426975F7AA.GeneratedTextTransformation' could be found (are you missing a using directive or an assembly reference?)
好像不是。
<#@ template hostSpecific="true"#>
在 .tt
文件之上解决所有问题。
我记得我在 2010 年找到了一种更简单的方法,但现在在网上查找该方法后,我再也找不到了。因此,经过一番挖掘,我设法在一个旧的源代码存储库中找到了它。这是我当时的做法,没有使用任何外部文件或依赖项:
<#@ template debug="false" hostspecific="true" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System" #>
<#@ import namespace="System.IO" #>
<#@ output extension=".txt" #>
<#
for (Int32 i = 0; i < 10; ++i) {
#>
Content <#= i #>
<#
// End of file.
SaveOutput("Content" + i.ToString() + ".txt");
}
#>
<#+
private void SaveOutput(string outputFileName) {
string templateDirectory = Path.GetDirectoryName(Host.TemplateFile);
string outputFilePath = Path.Combine(templateDirectory, outputFileName);
File.WriteAllText(outputFilePath, this.GenerationEnvironment.ToString());
this.GenerationEnvironment.Remove(0, this.GenerationEnvironment.Length);
}
#>
请注意,我不知道这个方法的原作者是谁。如果你恰好知道他或她是谁,欢迎留言。
这是 Tangible Engineering 的文档:
它要求您包含并使用模板文件管理器。步骤简述如下:
- 从他们的免费代码库中获取文件管理器 (https://t4-editor.tangible-engineering.com/Download_T4Editor_Plus_ModelingTools.html)
- 在主模板文件中包含文件管理器:
<#@ include file="TemplateFileManagerV2.1.ttinclude" #>
- 实例化管理器:
<# var manager = TemplateFileManager.Create(this); #>
- 使用管理器启动一个新文件:
<# manager.StartNewFile("Outputfile2.txt"); #>
请注意,这将在开始下一个文件之前结束先前启动的文件。 - 正常生成模板代码(将在新文件中生成,直到启动另一个文件或下面处理文件)
- 完成所有文件(将结束之前启动的文件):
<# manager.Process(); #>
此外,此方法会自动将新文件添加到项目中。
更新 -- 包含图片
第 1 部分:生成多个输出文件
创建模板
包括模板库中的可重复使用的模板管理器
测试输出到多个文件
第 2 部分:不同项目中的多个输出文件