Ejemplo n.º 1
0
 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));
            }
        }
Ejemplo n.º 3
0
        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);
        }