TexTransform cli 和版权符号

TexTransform cli and the copyright symbol

按照指导发现here, I've implemented a pre-build process designed to 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 的负担。它还需要对使用模板的每个项目进行手动干预(我们的团队一年内做很多不同的项目,其中许多需要多年的持续维护)。该过程还强制为每个构建重新生成(预构建事件生成一个临时文件并在尝试覆盖之前比较差异)。最后,此路径的结果似乎与预构建事件相同。

我还缺少哪些其他选项?

具体回答我的问题:我至少缺少另一个选项涉及编写自定义实用程序来为我生成 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 的一部分传入时将最后一个引号变成转义引号参数。

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

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

抱歉没能早点帮助到你。