private static void T4TransformAllAssets() { foreach (var templatePath in TemplateSettings.ListTemplatesInProject()) { UnityTemplateGenerator.RunForTemplate(templatePath); } }
private static void CheckChangedAssets() { var changedAssetsCopy = default(string[]); lock (changedAssets) { if (changedAssets.Count > 0) { changedAssetsCopy = changedAssets.ToArray(); changedAssets.Clear(); } } if (changedAssetsCopy == null) { return; } var triggeredTemplatePaths = new HashSet <string>(); foreach (var changedAsset in changedAssetsCopy) { //if (Menu.VerboseLogs) // Debug.Log("Changed Asset: " + changedAsset); if (!File.Exists(changedAsset)) { continue; } foreach (var watchedPath in templatePathByWatchedPaths.Keys) { if (changedAsset.StartsWith(watchedPath, StringComparison.Ordinal)) { foreach (var templatePath in templatePathByWatchedPaths[watchedPath]) { triggeredTemplatePaths.Add(templatePath); } } } } foreach (var templatePath in triggeredTemplatePaths) { if (Menu.VerboseLogs) { Debug.Log(string.Format("Asset modification is triggered T4 template's generator at '{0}'.", templatePath)); } var settings = TemplateSettings.Load(templatePath); UnityTemplateGenerator.RunForTemplateWithDelay(templatePath, TimeSpan.FromMilliseconds(settings.TriggerDelay)); } }
private static void Initialize() { EditorApplication.update -= InitializeCallback; System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(typeof(TemplateInspector).TypeHandle); foreach (var templatePath in TemplateSettings.ListTemplatesInProject()) { var settings = TemplateSettings.Load(templatePath); if ((settings.Trigger & (int)TemplateSettings.Triggers.CodeCompilation) == 0) { continue; } if (Menu.VerboseLogs) { Debug.Log(string.Format("Code compilation in project is triggered T4 template's generator at '{0}'.", templatePath)); } UnityTemplateGenerator.RunForTemplateWithDelay(templatePath, TimeSpan.FromMilliseconds(settings.TriggerDelay)); } }
public static bool RunForTemplate(string templatePath) { if (templatePath == null) { throw new ArgumentNullException("templatePath"); } templatePath = FileUtils.MakeProjectRelative(templatePath); var settings = TemplateSettings.Load(templatePath); var generator = new UnityTemplateGenerator(); var templateName = Path.GetFileNameWithoutExtension(templatePath); var templateDir = Path.GetDirectoryName(templatePath) ?? "Assets"; var templateNamespace = string.Join(".", templateDir.Split(new char[] { '\\', '/' }, StringSplitOptions.RemoveEmptyEntries)); var generatorOutputDir = Path.Combine("Temp", "T4"); var outputFile = Path.Combine(generatorOutputDir, Path.GetFileNameWithoutExtension(templatePath) + "_" + Guid.NewGuid().ToString().Replace("-", "") + ".tmp"); var generatorOutputFile = Path.ChangeExtension(outputFile, ".gen.cs"); var language = default(string); var references = default(string[]); if (Directory.Exists(generatorOutputDir) == false) { Directory.CreateDirectory(generatorOutputDir); } if (Menu.VerboseLogs) { Debug.Log(string.Format("Pre-process T4 template '{0}'. Output directory: '{1}'.", templatePath, generatorOutputDir)); } if (generator.PreprocessTemplate(templatePath, templateName, templateNamespace, generatorOutputFile, Encoding.UTF8, out language, out references) == false) { Debug.LogWarning(string.Format("Failed to pre-process template '{0}'.", templatePath)); foreach (var error in generator.Errors) { Debug.LogWarning(error); } return(false); } if (Menu.VerboseLogs) { Debug.Log(string.Format("Pre-process T4 template '{0}' is complete successfully. Language: '{1}', References: '{2}', Output file: '{3}'.", templatePath, language, string.Join(", ", references ?? new string[0]), generatorOutputFile)); } if (Menu.VerboseLogs) { Debug.Log(string.Format("Process T4 template '{0}'. Output File: '{1}'.", templatePath, outputFile)); } if (generator.ProcessTemplate(templatePath, ref outputFile) == false) { Debug.LogWarning(string.Format("Failed to process template '{0}'.", templatePath)); var warnText = new StringBuilder(); foreach (CompilerError error in generator.Errors) { warnText.AppendLine(error.ToString()); } if (warnText.Length > 0) { Debug.LogWarning(warnText); } return(false); } if (Menu.VerboseLogs) { Debug.Log(string.Format("Process T4 template '{0}' is complete successfully. Output file: '{1}'.", templatePath, outputFile)); } var sourceFile = default(string); switch ((TemplateSettings.OutputTypes)settings.OutputType) { case TemplateSettings.OutputTypes.Code: sourceFile = outputFile; break; case TemplateSettings.OutputTypes.CodeGenerator: sourceFile = generatorOutputFile; break; default: Debug.LogWarning("Invalid 'OutputType' is specified in template's settings."); return(false); } var targetFile = settings.OutputPath; if (targetFile == null) { targetFile = Path.GetFullPath(Path.ChangeExtension(templatePath, Path.GetExtension(sourceFile))); } else { targetFile = Path.GetFullPath(targetFile); } if (File.Exists(targetFile) && FileUtils.ComputeMd5Hash(targetFile) == FileUtils.ComputeMd5Hash(sourceFile)) { if (Menu.VerboseLogs) { Debug.Log(string.Format("Generated file is same as existing at location '{0}'.", targetFile)); } return(false); } var targetDir = Path.GetDirectoryName(targetFile); if (targetDir != null && Directory.Exists(targetDir) == false) { Directory.CreateDirectory(targetDir); } File.Copy(sourceFile, targetFile, overwrite: true); File.Delete(outputFile); File.Delete(generatorOutputFile); return(true); }