Кто-нибудь знает, как остановить шаблоны T4 (tt) от пересоздания каждого файла?Есть ли способ пометить определенные файлы? - PullRequest
1 голос
/ 06 ноября 2010

Таким образом, шаблоны tt будут восстанавливать каждый файл при каждом сохранении.Теперь отлично, он генерирует файлы.Тем не менее, я делаю частичные классы для расширения других классов, но мне нужны только файлы, которые еще не существуют для меня сгенерированы.Те, которые существуют, я бы хотел сохранить.До сих пор я не нашел ни одного твердого решения, которое погуглило бы по всему миру ...

В моем коде ниже исключение для поиска существующих файлов не имеет значения, потому что шаблон начнется с удаления всех файлов первым.Затем он регенерирует.

Есть ли такой метод, как "onsave", который я могу переопределить?

// BEGIN CODE TO GENERATE EXTENSIONS
<#
foreach (EntityType entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name))
{ 
 string fileName = entity.Name + ".Extension.cs";
 string filePath = this.Host.TemplateFile.Substring(0,this.Host.TemplateFile.LastIndexOf(@"\")); 
 filePath = filePath + @"\Extensions\" + fileName;
 if((File.Exists(filePath) && PreserveExistingExtensions == false) || !File.Exists(filePath))
 {
  fileManager.StartNewFile(fileName);
  BeginNamespace(namespaceName, code);
  bool entityHasNullableFKs = entity.NavigationProperties.Any(np => np.GetDependentProperties().Any(p=>ef.IsNullable(p)));
#>
<#=Accessibility.ForType(entity)#>   
<#=code.SpaceAfter(code.AbstractOption(entity))#>partial class 
<#=code.Escape(entity)#><#=code.StringBefore(" : ", code.Escape(entity.BaseType))#>
{
}
<#
EndNamespace(namespaceName);
 }
}
fileManager.Process();
#>

1 Ответ

2 голосов
/ 06 ноября 2010

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

  1. MyClass.generated.cs
  2. MyClass.cs

MyClass.cs никогда не будет воссоздан, если он не существует. MyClass.generated.cs всегда будет пересоздан.

Я использую T4toolbox , чтобы сделать это, Олег Сыч на самом деле сделал это довольно легко.

Вы можете посмотреть некоторые образцы шаблонов T4, которые я построил здесь . В частности, посмотрите на этот , это хороший пример для сгенерированных частичных классов, где нужно каждый раз создавать его, и он создается только в том случае, если его не существует.

Главное, на что нужно обратить внимание, это строка в коде:

    var requestBaseMessageCustom = new MessageTemplate(rootNamespace, serviceName + "Request");
    requestBaseMessageCustom.Output.File = "Messages/" + serviceName + "Request.cs";
    requestBaseMessageCustom.Output.PreserveExistingFile = true;
    requestBaseMessageCustom.Render();

Обратите внимание на свойство с именем PreserveExistingFile, это ключ.

...