TexTransform cli和版权符号

时间:2016-04-08 15:05:37

标签: visual-studio templates t4 pre-build-event

在遵循here找到的指导后,我实施了针对dynamical update assembly copyright的预构建流程。

版权模板是

<#@ template language="C#" #>
<#@ output extension=".cs" #>
using System;
using System.Reflection;

[assembly: AssemblyCopyright("Copyright © <#=DateTime.Now.Year#>")]

如果我将文件保存在VS中,生成的文件(和编译的程序集)正确包含版权符号(©)。作为预构建调用TextTransform.exe(在本例中为v12.0)的一部分完成时,生成的文件包含“?”代替。我得到相同的结果指定encoding="us-ascii"当编码设置为任何utf变体时,它出现为' '。在编译程序集时,修改模板以使用\ u00A9会得到相同的结果。

我知道我可以合并code generation in the solution build process,但这会增加新员工(以及新环境设置;我们在VM中进行大量开发)的负担,确保安装适当的SDK。它还需要使用模板对每个项目进行人工干预(我们的团队在一年内完成了许多不同的项目,其中许多项目需要多年的持续维护)。该过程还强制每个构建重新生成(预构建事件生成到临时文件并在尝试覆盖之前比较差异)。最后,此路径的结果似乎与预构建事件的结果相同。

我错过了哪些其他选择?

2 个答案:

答案 0 :(得分:2)

我对版权符号有同样的问题,并为我的T4模板找到了这个解决方案。

[assembly: AssemblyCopyright("Copyright <#='\u00A9'#> <#=DateTime.Now.Year#>")]

抱歉,我不能早点帮助你。

答案 1 :(得分:0)

专门回答我的问题:我至少缺少一个其他选项,包括编写一个自定义实用程序来为我生成cs文件。只有当文件实际上不同或尚未存在时,此代码才会使用正确的版权标记写出该文件。

我已将其实施为针对使用VS2015编写的第4版框架的控制台应用。

namespace GenerateAssemblyCopyright
{
  class Program
  {
    const string _fileName = "AssemblyCopyright.cs";
    static void Main(string[] args)
    {
      if (args.Length == 0 || !Directory.Exists(args[0]))
        throw new InvalidOperationException("Must supply path for assembly copyright file");

      var acPath = Path.Combine(args[0], _fileName);
      var potentialOutput = $@"using System;
using System.Reflection;

[assembly: AssemblyCopyright(""Copyright © {DateTime.Now.Year}"")]";
      var exitingOutput = string.Empty;

      if (File.Exists(acPath))
      {
        using (var sr = new StreamReader(acPath, true))
        {
          exitingOutput = sr.ReadToEnd();
        }
      }

      if (!exitingOutput.Equals(potentialOutput))
      {
        using (var sw = new StreamWriter(acPath, false, Encoding.UTF8))
        {
          sw.Write(potentialOutput);
        }
      }
    }
  }
}

我将生成的exe复制到解决方案目录中,并在解决方案的第一个项目中定义预构建事件。

:: set the correct path to the the GenerateCopyright app
set "generateExe=$(SolutionDir)GenerateAssemblyCopyright.exe"

"%generateExe%" "$(SolutionDir)\"

有一点需要注意:尽管$(SolutionDir)已经包含一个尾部反斜杠(),但是当作为exe args的一部分传入时,需要额外的反斜杠来防止将最后一个引号转换为转义引号。