T4模板生成文件要点记录

可以使用 $(variableName) 语法引用 Visual Studio 或 MSBuild 变量(如 $(SolutionDir)),以及使用 %VariableName% 来引用环境变量。
介绍几个常用的$(variableName) 变量:

$(SolutionDir):当前项目所在解决方案目录
$(ProjectDir):当前项目所在目录
$(TargetPath):当前项目编译输出文件绝对路径
$(TargetDir):当前项目编译输出目录,即web项目的Bin目录,控制台、类库项目bin目录下的debug或release目录(取决于当前的编译模式)

举个例子:比如我们在D盘根目录建立了一个控制台项目TestConsole,解决方案目录为D:\LzrabbitRabbit,项目目录为
D:\LzrabbitRabbit\TestConsole,那么此时在Debug编译模式下
$(SolutionDir)的值为D:\LzrabbitRabbit
$(ProjectDir)的值为D:\LzrabbitRabbit\TestConsole
$(TargetPath)值为D:\LzrabbitRabbit\TestConsole\bin\Debug\TestConsole.exe
$(TargetDir)值为D:\LzrabbitRabbit\TestConsole\bin\Debug\


若要创建运行时模板,请向您的项目中添加“已预处理的文本模板”文件。 另外,您还可以添加纯文本文件并将其“自定义工具”属性设置为“TextTemplatingFilePreprocessor”。
若要创建设计时模板,请向您的项目中添加“文本模板”文件。 另外,您还可以添加纯文本文件并将其“自定义工具”属性设置为“TextTemplatingFileGenerator”。

T4基本结构
T4模板可以分为:指令块、文本块、控制块。
    指令块 - 向文本模板化引擎提供关于如何生成转换代码和输出文件的一般指令。
    文本块 - 直接复制到输出的内容。
    控制块 - 向文本插入可变值并控制文本的条件或重复部件的程序代码,不能在控制块中嵌套控制块。

6个指令<#@ template #>、<#@ parameter#>、<#@ assembly #>、<#@ import #>、<#@ include #>、<#@ output #>、
其中, output 和 assembly 只能用在设计时模板。

控制块
有三种类型的控制块,根据其左括号对它们进行区分:
1.<# 标准控制块 #>  可以包含语句。
2.<#= 表达式控制块 #>  将一个可以计算为字符串的表达式括起来,用于提供要写入“输出”文件的字符串的代码。
3.<#+ 类功能控制块 #>  可以使用类功能控制块向文本模板添加方法、属性、字段甚至是嵌套类。必须作为文件中的最后一个块显示,或者用<#@ include #>引入外部文件。

注意:
1)始终使用 {...}花括号来包含内嵌的嵌套语句,否则会报错。(哪怕花括号中只有一句代码)
2)控制块不能互相嵌套。必须先终止之前的控制块,然后才能打开另一个。


T4文本模板的断点调试
    注册表:设置DbgJITDebugLaunchSetting值为 2。
    (x86系统): HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework
    (x64 系统): HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework

    为template指令添加debug="true"特性:<#@ template debug="true"#>
   
    命令:
    <# System.Diagnostics.Debugger.Launch();#>在模板执行到特定点启动调试器。如果用Debugger.Break()启动调试器在调试完后会导致 VS 奔溃。
    <#System.Diagnostics.Debugger.Break();#>启动调试器后,使用此命令在后续特定点处再次进入调试模式,相当于断点。(此种方式会让vs崩溃)

使用方法:必须使用“Debugger.Launch()”命令启动调试器(如下图,启动新实例或使用已存在的VS附加。注意,若此处点击取消则将关闭当前IDE),调试完后可以不用中断调试,不影响模板编辑,当再次编译模板时如果存在“Debugger.Break()”命令则自动进入调试模式。

自定义生成的文件存放路径:
String outputPath = Path.Combine(Path.GetDirectoryName(host.TemplateFile),"Model");

调试的时候发现一个问题:在GetCurrentProject()方法里获取当前项目dte.ActiveSolutionProjects,第一次生成正常,但是一编译项目再生成,这里就获取不到项目了,
Array activeSolutionProjects = (Array)dte.ActiveSolutionProjects 里面是个空数组,导致生成失败,提示“正在运行转换: System.IndexOutOfRangeException: 索引超出了数组界限”错误。


万般无奈,只好采用避开调用这里的措施:
在.tt模板里,把定义connectionString、dbProviderName的地方重新写死。如:
var connectionStringName = "Northwind";
var dbContextName = Host.TemplateFile.Split('\\')[Host.TemplateFile.Split('\\').Length - 1].TrimEnd('.', 't');
//var connectionStringSetting = GetConnectionStringSettings(connectionStringName);
//var connectionString = connectionStringSetting.ConnectionString;
//var dbProviderName = connectionStringSetting.ProviderName;

var connectionString = "Data Source=ZHAOWEI-PC\\SQLEXPRESS;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=123456";
var dbProviderName = "System.Data.SqlClient";

var dbConfiguration = DbConfiguration.Configure(connectionString, dbProviderName);
var databaseSchema = dbConfiguration.Schema;
var manager = Manager.Create(Host, GenerationEnvironment);
var namespace1 = manager.DefaultProjectNamespace+".Model";
manager.StartHeader();
。。。。
这样问题暂时解决了。

-------------------------------------------------------------------------------------------------------------
T4模板调试需注意的地方:
1、.tt模板的属性 自定义工具=TextTemplatingFileGenerator,生成操作=无;
      生成的附属文件属性 自定义工具=无,生成操作=编译
2、在下列任何一种情况下,将执行模板,同时生成附属文件:
    编辑该模板,然后将焦点更改到其他 Visual Studio 窗口。
    保存模板。
    单击“生成”菜单中的“转换所有模板”。 这将转换 Visual Studio 解决方案中的所有模板。
    在“解决方案资源管理器”中,在任何文件的快捷菜单上,选择“运行自定义工具”。 使用此方法可以转换选定的模板子集。

   
<#@ import namespace="EnvDTE" #>

EnvDTE路径:
C:\Program Files (x86)\Common Files\microsoft shared\MSEnv\PublicAssemblies
<#@ Assembly Name="C:\Program Files (x86)\Common Files\microsoft shared\MSEnv\PublicAssemblies\envdte.dll" #>
<#@ Import namespace="EnvDTE80" #>
<#@ Import namespace="EnvDTE90" #>
<#@ Import namespace="EnvDTE90a" #>
<#@ Import namespace="EnvDTE100" #>


private EnvDTE.Project getActiveProject(EnvDTE.DTE dte)
{
    Array projects = dte.ActiveSolutionProjects as Array;
    if (projects == null || projects.Length == 0)
    {
        projects = dte.Solution.SolutionBuild.StartupProjects as Array;
        if (projects == null || projects.Length == 0)
        {
            EnvDTE.Projects pro = dte.Solution.Projects;
            if (pro == null || pro.Count == 0)
                return null;
            return pro.Item(0);
        }
    }
    return projects.GetValue(0) as EnvDTE.Project;
}
   
public Project getActiveProject()
{
  Array projects = (Array)_applicationObject.ActiveSolutionProjects;
  if(projects != null && projects.Length > 0)
  {
    return projects.GetValue(0) as Project;
  }
  projects = (Array)_applicationObject.Solution.SolutionBuild.StartupProjects;
  if(projects != null && projects.Length >= 1)
  {
    return projects.GetValue(0) as Project;
  }
  projects = (Array)_applicationObject.Solution.Projects;
  if(projects != null && projects.Length > 0)
  {
    return projects.GetValue(0) as Project;
  }
  return null;
}

待解决问题:
 (Array)dte.ActiveSolutionProjects IndexOutOfRangeException
 (Array)dte.ActiveSolutionProjects 索引超出了数组界限


参考:
https://msdn.microsoft.com/zh-cn/library/gg604090
https://msdn.microsoft.com/zh-cn/library/dd820620
http://www.cnblogs.com/guohu/p/4541418.html
http://blog.chenxu.me/post/detail?id=2c393950-acbe-4367-8039-a326449c8d22
https://social.msdn.microsoft.com/Forums/vstudio/en-US/4b746a30-9f6f-446b-9e1e-54b5ba3f29b7/activesolutionprojects-indexoutofrange?forum=vsx

转载于:https://www.cnblogs.com/zhaow/p/9754062.html

### 回答1: VS Code T4 模板是一种用于生成 JavaScript 代码的工具。它基于 T4(Text Template Transformation Toolkit)技术,允许开发者定义模板并在生成代码时将其应用于指定的数据。 使用 VS Code T4 模板生成 JavaScript 代码非常简单。首先,我们需要安装 "T4" 扩展插件,该插件提供了 T4 模板引擎的支持。安装完成后,我们可以创建一个新的 T4 模板文件,并在其中编写模板代码。 T4 模板使用一种特殊的标记语法,类似于 HTML 的标签。我们可以在模板中定义变量、循环、判断等逻辑,并根据需要生成相应的 JavaScript 代码。模板还可以包含外部引用的文件或库,以便在代码生成过程中使用。 一旦模板编写完成,我们可以在模板文件上右键点击,并选择 "运行 T4 模板" 选项,或使用命令面板搜索并运行相应命令。这将触发模板引擎执行,根据模板和提供的数据生成 JavaScript 代码。 T4 模板可以根据我们定义的逻辑和数据生成任意数量的 JavaScript 代码文件。这为我们提供了一种自动化生成重复代码的方式,在项目开发中可以极大地提高效率和代码质量。 总之,VS Code T4 模板提供了一种方便的方式来生成 JavaScript 代码。通过定义模板和提供相应的数据,我们可以自动生成符合需求的 JavaScript 代码,减少重复工作并提高开发效率。无论是创建新项目、添加新功能还是生成测试数据,T4 模板都能为我们提供一种强大的辅助工具。 ### 回答2: VSCode是一款功能强大的文本编辑器,它提供了许多扩展插件,其中包括T4模板生成JS。T4模板是一种用于生成代码的模板引擎,它使用C#或VB.NET编写模板代码,并通过内置的代码生成引擎将模板代码转换为最终的输出。 在VSCode中使用T4模板生成JS非常简单。首先,我们需要安装T4模板插件。可以通过在VSCode的扩展商店中搜索"T4 Template"来找到并安装这个插件。安装完成后,我们可以在VSCode的侧边栏中找到T4模板生成器的图标。 接下来,我们需要创建一个T4模板文件。可以使用`.tt`作为扩展名来命名文件,并打开该文件进行编辑。在模板文件中,我们可以使用C#或VB.NET编写代码块,并使用特定的语法来控制模板生成的过程。我们可以定义输入参数、循环结构、条件语句等,以生成不同的输出内容。 在T4模板生成JS代码的过程与生成其他类型的代码并无太大区别。我们可以在模板中定义JS变量、函数、类等,并使用T4模板提供的代码生成功能来生成相应的JS代码。 当模板文件中的代码编写完成后,我们可以保存文件并触发模板生成过程。在VSCode的命令面板中,输入"T4 Template"并选择生成模板命令,就可以将模板文件转换为对应的JS代码文件。 总结来说,使用VSCode的T4模板插件可以方便地生成JS代码。我们只需要编写模板文件,定义所需的JS代码结构和逻辑,然后由T4模板生成器自动转换为最终的JS代码文件。这样,我们可以更高效地生成大量的JS代码,并减少手工编写的工作量。 ### 回答3: VSCode是一款功能强大的代码编辑器,它支持通过T4模板生成JavaScript代码。 T4模板是一种文本生成引擎,它允许我们根据定义的模板规则生成特定的代码文件。在VSCode中使用T4模板生成JavaScript代码可以提高开发效率和代码质量。 首先,我们需要安装VSCode的T4模板插件,可以在VSCode的插件市场中搜索并安装。安装完成后,我们可以在VSCode的扩展面板中找到并启用T4模板相关功能。 接下来,在VSCode中创建一个新的文件,并将其命名为T4模板文件,通常以.tt作为文件扩展名。在T4模板文件中,我们可以使用类似于ASP.NET的标签语法来定义模板中的输入和输出。 在模板文件中,我们可以定义输入参数,例如要生成的JavaScript文件的名称和路径。然后,可以使用T4模板提供的标签和指令,通过循环、条件语句和字符串操作等方式来生成JavaScript代码。 使用T4模板生成JavaScript代码的好处是我们可以根据不同的需求和条件生成不同的代码。这样可以提高代码的可维护性和复用性。同时,T4模板还支持自定义函数和引用外部库,可以更灵活地生成JavaScript代码。 最后,我们可以通过执行模板文件生成JavaScript代码。在VSCode中,我们可以打开T4模板文件,右键点击并选择“转换为输出文件”,这将会根据模板文件的定义生成相应的JavaScript代码文件。 总结起来,通过VSCode的T4模板插件,我们可以方便地生成JavaScript代码。通过定义模板规则和执行模板文件,我们可以根据需求快速生成高质量的JavaScript代码。这对于JavaScript开发者来说是一个非常有用的工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值