TexTransform cli и символ авторского права

Следуя инструкциям, найденным здесь , я реализовал процесс предварительной сборки, предназначенный для динамического обновления авторских прав сборки.

Шаблон для авторских прав

<#@ 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, он отображается как «�». Изменение шаблона для использования © дает те же результаты при компиляции сборки.

Я знаю, что могу работать над включением кода в процессе сборки решения, но это увеличивает нагрузку на новых сотрудников (и настройку новой среды; мы много разрабатываем на виртуальных машинах), гарантируя установку соответствующих SDK. Это также требует ручного вмешательства для каждого проекта с использованием шаблона (наша группа выполняет множество различных проектов в год, и многие из них требуют многолетнего постоянного обслуживания). Этот процесс также вызывает регенерацию для каждой сборки (событие перед сборкой генерируется во временный файл и сравнивается на наличие различий перед попыткой перезаписать). И, наконец, результаты этого пути кажутся такими же, как и с событием перед сборкой.

Какие еще варианты мне не хватает?


person Ron O    schedule 08.04.2016    source источник


Ответы (2)


У меня была такая же проблема со знаком авторского права, и я нашел это решение для своего шаблона T4.

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

Прости, что не смог помочь тебе раньше.

person Rod M    schedule 13.01.2017

Чтобы конкретно ответить на мой вопрос: по крайней мере еще один вариант, который мне не хватало, заключался в написании специальной утилиты для создания файла cs для меня. Этот код записывает файл с правильным знаком авторского права, только если он действительно отличается или еще не существует.

Я реализовал его как консольное приложение, ориентированное на платформу версии 4, написанную с использованием VS2015.

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.

person Ron O    schedule 22.04.2016