コード例 #1
0
        private static TemplateVariables CreateTemplateVariables(PackageTemplateOptions options)
        {
            var version = InternalEditorUtility.GetUnityVersion();

            return(new Dictionary <string, string>
            {
                { "NAME", options.name },
                { "DISPLAYNAME", options.displayName },
                { "ROOTNAMESPACE", options.rootNamespace },
                { "UNITYVERSION", $"{version.Major}.{version.Minor}" },
                { "CURRENTDATE", DateTime.Now.ToString("yyyy-MM-dd") },
            });
        }
コード例 #2
0
        private static void ValidateOptions(PackageTemplateOptions options)
        {
            var errors = new List <string>();
            var requiredErrorMessage = L10n.Tr("{0} is required");

            options.name = options.name?.Trim();
            if (string.IsNullOrEmpty(options.name))
            {
                errors.Add(string.Format(requiredErrorMessage, nameof(options.name)));
            }
            else if (!Validation.ValidateName(options.name))
            {
                errors.Add(string.Format(L10n.Tr("Package name [{0}] is invalid"), options.name));
            }
            else if (GetAllPackagesInfo().Any(p => p.name == options.name))
            {
                errors.Add(string.Format(L10n.Tr("The project already contains a package with the name [{0}]."), options.name));
            }

            options.displayName = options.displayName?.Trim();
            if (string.IsNullOrEmpty(options.displayName))
            {
                errors.Add(string.Format(requiredErrorMessage, nameof(options.displayName)));
            }

            options.rootNamespace = options.rootNamespace?.Trim();
            if (!string.IsNullOrEmpty(options.rootNamespace) && !ValidateRootNamespace(options.rootNamespace))
            {
                errors.Add(string.Format(L10n.Tr("[{0}] is not a valid namespace"), options.rootNamespace));
            }

            options.templateFolder = options.templateFolder?.Trim();
            if (string.IsNullOrEmpty(options.templateFolder))
            {
                errors.Add(string.Format(requiredErrorMessage, nameof(options.templateFolder)));
            }
            else if (!Directory.Exists(options.templateFolder))
            {
                errors.Add(string.Format(L10n.Tr("The template folder [{0}] does not exist"), options.templateFolder));
            }

            if (errors.Count > 0)
            {
                var invalidParamMsg = string.Format(L10n.Tr("{0} parameter is invalid"), nameof(options));
                var errorMsg        = string.Join(Environment.NewLine, errors.ToArray());
                throw new ArgumentException($"{invalidParamMsg}:{Environment.NewLine}{errorMsg}");
            }
        }
コード例 #3
0
        public static string CreatePackage(PackageTemplateOptions options)
        {
            ValidateOptions(options);

            var targetFolder = $"Packages/{options.name}";

            if (Directory.Exists(targetFolder))
            {
                throw new InvalidOperationException(string.Format(L10n.Tr("The target folder [{0}] for this new package already exists."), targetFolder));
            }

            var variables      = CreateTemplateVariables(options);
            var templateFolder = options.templateFolder;
            var tempFolder     = FileUtil.GetUniqueTempPathInProject();

            try
            {
                FileUtil.CopyFileOrDirectory(templateFolder, tempFolder);

                foreach (var file in GetPackageTemplateFiles(tempFolder))
                {
                    File.SetAttributes(file, File.GetAttributes(file) & ~FileAttributes.ReadOnly);
                    ReplaceVariablesInFile(variables, file);
                    RenameFileWithVariables(variables, file);
                }

                Directory.Move(tempFolder, targetFolder);
            }
            finally
            {
                if (Directory.Exists(tempFolder))
                {
                    Directory.Delete(tempFolder, true);
                }
            }

            return(targetFolder);
        }