【问题标题】:T4 templates - avoid empty lines from included filesT4 模板 - 避免包含文件中的空行
【发布时间】:2012-05-07 08:13:33
【问题描述】:

我将 T4 代码拆分为单独的文件以实现模块化和重用,但我发现每个文件在输出中花费了我一个空行。例如:

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".ttinclude" #>
<#@ Import Namespace="System.Collections.Generic" #>
<#@ Include file="Includes.tt" #>
namespace <#= NameSpace #>
{

如果 Includes.tt 列出了 3 个其他 *.tt 文件,我会在命名空间前得到 3 个空行。当我添加代码并将其拆分为单独的 *.tt 文件时,这个空白空间不断增长。事实上,我将所有包含文件打包到一个单独的 Includes.tt 中,希望这将花费我一个空行。它没有。对于 Includes.tt 中列出的每个文件,我仍然得到一个空行。有没有办法避免这种情况?

编辑:假设我不只是犯了一个愚蠢的错误(我真诚地希望我是),这个问题并不像乍一看那样微不足道:

a) 通过包含的 T4 文件实现重用和模块化与 T4 本身一样古老,并且在最新的 MSDN 杂志文章中提到:“管理 T4 代码生成解决方案中的复杂性”。

b) 如果代码是自动生成的,并不意味着格式错误或可读性差就可以。

c) 在我的情况下,对于当前的解决方案,对于每个 生成的 .cs 文件,读者必须滚动查看一个空白页面,直到她开始看到一些生成的文本。这一切都是因为我在多个包含的 .tt 文件之间拆分了我的代码生成。这似乎不对。

【问题讨论】:

    标签: t4


    【解决方案1】:

    补充托尼的答案:您可以通过在 T4 括号内添加换行符来避免很长的行,如下所示:

    <#@ template debug="false" hostspecific="false" language="C#" #>
    <#@ output extension=".ttinclude" #>
    <#@ Import Namespace="System.Collections.Generic" #>
    <#@ Include file="Usings.tt" 
    #><#@ Include file="PropertyTypeEnum.tt" 
    #><#@ Include....
    #><#@ Include....
    #><#@ Include....
    #><#@ some other stuff 
    

    【讨论】:

    • 噢噢噢!这就是它的用途。 我今天学到了一些新东西。 +1
    【解决方案2】:

    哦,好吧,结果证明这个解决方案是微不足道的,如果有点出乎意料的话:只需将包含指令 next 放在一起,而不是一个 below 另一个:

    <#@ template debug="false" hostspecific="false" language="C#" #>
    <#@ output extension=".ttinclude" #>
    <#@ Import Namespace="System.Collections.Generic" #>
    <#@ Include file="Usings.tt" #> <#@ Include file="PropertyTypeEnum.tt" #> <#@ Include.... 
    

    【讨论】:

    • 嗨,Tony - 这是我们早期版本的一些遗产。我们现在有点不愿意“修复”它,因为这会破坏使用该解决方法的人的向后兼容性。我们玩弄了一个选择加入标志的想法,比如“smarterParsing=true”,但我现在不太想测试两个解析代码路径。
    • 即使使用单个包含,同样的技巧也适用 - 只需确保包含的结束标记和下一条指令之间没有字符(无论是文字还是
    • 真正的原因是每个生成的模板(它是cs代码)在public virtual string TransformText() { this.Write(" \r\n");中都有一个\r\n,所以你的答案只是工作,因为在每个包含的模板之后按回车键添加的换行符是省略。
    • 这是一个真正的问题。我会让 T4 代码比生成的代码更具可读性,特别是如果它只与艾伦线有关?还是我错过了什么?
    【解决方案3】:

    我有一个更根本的问题,&lt;?xml 之前的每个 &lt;#@ 标题行在输出中导致了自己的空白行,从而导致了错误:

    error : Unexpected XML declaration.
            The XML declaration must be the first node in the document,
            and no white space characters are allowed to appear before it.
            Line 7, position 3.
    

    经过一段时间的挖掘,我发现 .tt 文件有 Unix EOL。

    当我切换到 Windows EOL 时,转换删除了空白行。

    【讨论】:

    • 今天得到了这个 :) 感谢您写下答案!
    • 我用 Unix EOL 粘贴了代码。 Windows EOL 不会从包含的文件中生成空行。谢谢!
    • 你成就了我的一天。谢谢。
    • 哇,微妙的行为,非常感谢!纯文本电子邮件模板中的杀手...
    【解决方案4】:

    这在 VS 2013 中也适用于我:

    <#@ include file="Other.tt" #><##>
    

    等等

    <#@ include file="One.tt" #><##>
    <#@ include file="Two.tt" #><##>
    ...
    

    &lt;##&gt; 只是一个空的控制块。 &lt;# /* any code here */ #&gt; 也可以。

    【讨论】:

      【解决方案5】:

      在我的例子中,空行是由 import 语句的结束标记后的尾随空格产生的。

      【讨论】:

      • 2017 年 7 月遇到空行问题,原因是导入语句行尾随空格。
      • 我可以确认关闭导入标签后的尾随空格也是 Visual Studio 2019 中出现空行的原因。
      【解决方案6】:

      对我来说,使用 Unix 换行符 (LF) 时会出现问题。使用 Windows 换行符 (CR LF) 解决了我的问题,也可能解决您的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多