在遵循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。它还需要使用模板对每个项目进行人工干预(我们的团队在一年内完成了许多不同的项目,其中许多项目需要多年的持续维护)。该过程还强制每个构建重新生成(预构建事件生成到临时文件并在尝试覆盖之前比较差异)。最后,此路径的结果似乎与预构建事件的结果相同。
我错过了哪些其他选择?
答案 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的一部分传入时,需要额外的反斜杠来防止将最后一个引号转换为转义引号。