private void AddReplacementToken(string tokenKey, ITemplateToken token)
        {
            if (tokens.TryGetValue(tokenKey, out ITemplateToken existingToken))
            {
                if (!(existingToken is MultipleTemplateToken multipleTemplateToken))
                {
                    multipleTemplateToken = new MultipleTemplateToken();
                    multipleTemplateToken.Tokens.Add(existingToken);

                    tokens[tokenKey] = multipleTemplateToken;
                }

                multipleTemplateToken.Tokens.Add(token);
            }
            else
            {
                tokens[tokenKey] = token;
            }
        }
        ///<inherit-doc/>
        public void ExportSolution(UnityProjectInfo unityProjectInfo)
        {
            string solutionFilePath = GetSolutionFilePath(unityProjectInfo);

            if (File.Exists(solutionFilePath))
            {
                File.Delete(solutionFilePath);
            }
            ITemplatePart          rootTemplatePart   = solutionFileTemplate.Root;
            TemplateReplacementSet rootReplacementSet = rootTemplatePart.CreateReplacementSet();

            ITemplatePart projectTemplate               = rootTemplatePart.Templates["PROJECT"];
            ITemplatePart folderTemplate                = rootTemplatePart.Templates["FOLDER"];
            ITemplatePart configPlatformTemplate        = rootTemplatePart.Templates["CONFIGURATION_PLATFORM"];
            ITemplatePart configPlatformMappingTemplate = rootTemplatePart.Templates["CONFIGURATION_PLATFORM_MAPPING"];
            ITemplatePart configPlatformEnabledTemplate = rootTemplatePart.Templates["CONFIGURATION_PLATFORM_ENABLED"];
            ITemplatePart folderNestedProjectsTemplate  = rootTemplatePart.Templates["FOLDER_NESTED_PROJECTS"];

            CSProjectInfo[]      unorderedProjects = unityProjectInfo.CSProjects.Select(t => t.Value).ToArray();
            List <CSProjectInfo> orderedProjects   = new List <CSProjectInfo>();

            while (orderedProjects.Count < unorderedProjects.Length)
            {
                bool oneRemoved = false;
                for (int i = 0; i < unorderedProjects.Length; i++)
                {
                    if (unorderedProjects[i] == null)
                    {
                        continue;
                    }

                    if (unorderedProjects[i].ProjectDependencies.Count == 0 || unorderedProjects[i].ProjectDependencies.All(t => orderedProjects.Contains(t.Dependency)))
                    {
                        orderedProjects.Add(unorderedProjects[i]);

                        unorderedProjects[i] = null;
                        oneRemoved           = true;
                    }
                }

                if (!oneRemoved)
                {
                    Debug.LogError($"Possible circular dependency.");
                    break;
                }
            }

            List <CSProjectInfo> builtinPackages  = new List <CSProjectInfo>();
            List <CSProjectInfo> importedPacakges = new List <CSProjectInfo>();
            List <CSProjectInfo> externalPackages = new List <CSProjectInfo>();

            foreach (CSProjectInfo project in orderedProjects)
            {
                TemplateReplacementSet replacementSet = projectTemplate.CreateReplacementSet(rootReplacementSet);
                ProcessProjectEntry(project.Name, GetProjectPath(project).FullName, project.Guid, project.ProjectDependencies, projectTemplate, replacementSet);

                switch (project.AssemblyDefinitionInfo.AssetLocation)
                {
                case AssetLocation.BuiltInPackage:
                    builtinPackages.Add(project);
                    break;

                case AssetLocation.PackageLibraryCache:
                    importedPacakges.Add(project);
                    break;

                case AssetLocation.External:
                    externalPackages.Add(project);
                    break;

                default: break;
                }
            }

            // Add the "Dependencies" project
            ProcessProjectEntry("Dependencies", GetProjectFilePath(Utilities.AssetPath, "Dependencies"), Guid.NewGuid(), null, projectTemplate, projectTemplate.CreateReplacementSet(rootReplacementSet));

            PopulateFolder(folderTemplate, folderNestedProjectsTemplate, rootReplacementSet, "Built In Packages", builtinPackages);
            PopulateFolder(folderTemplate, folderNestedProjectsTemplate, rootReplacementSet, "Imported Packages", importedPacakges);
            PopulateFolder(folderTemplate, folderNestedProjectsTemplate, rootReplacementSet, "External Packages", externalPackages);

            ITemplateToken configPlatform_ConfigurationToken = configPlatformTemplate.Tokens["CONFIGURATION"];
            ITemplateToken configPlatform_PlatformToken      = configPlatformTemplate.Tokens["PLATFORM"];

            foreach (CompilationPlatformInfo platform in unityProjectInfo.AvailablePlatforms)
            {
                TemplateReplacementSet replacementSet = configPlatformTemplate.CreateReplacementSet(rootReplacementSet);
                configPlatform_ConfigurationToken.AssignValue(replacementSet, "InEditor");
                configPlatform_PlatformToken.AssignValue(replacementSet, platform.Name);

                replacementSet = configPlatformTemplate.CreateReplacementSet(rootReplacementSet);
                configPlatform_ConfigurationToken.AssignValue(replacementSet, "Player");
                configPlatform_PlatformToken.AssignValue(replacementSet, platform.Name);
            }

            List <string> disabled = new List <string>();

            foreach (CSProjectInfo project in orderedProjects.Select(t => t))
            {
                void ConfigurationTemplateReplace(ITemplatePart templatePart, TemplateReplacementSet replacementSet, string guid, string configuration, string platform)
                {
                    templatePart.Tokens["PROJECT_GUID"].AssignValue(replacementSet, guid.ToString().ToUpper());
                    templatePart.Tokens["PROJECT_CONFIGURATION"].AssignValue(replacementSet, configuration);
                    templatePart.Tokens["PROJECT_PLATFORM"].AssignValue(replacementSet, platform);
                    templatePart.Tokens["SOLUTION_CONFIGURATION"].AssignValue(replacementSet, configuration);
                    templatePart.Tokens["SOLUTION_PLATFORM"].AssignValue(replacementSet, platform);
                }

                void ProcessMappings(Guid guid, string configuration, IReadOnlyDictionary <BuildTarget, CompilationPlatformInfo> platforms)
                {
                    foreach (CompilationPlatformInfo platform in unityProjectInfo.AvailablePlatforms)
                    {
                        TemplateReplacementSet replacemetSet = configPlatformMappingTemplate.CreateReplacementSet(rootReplacementSet);
                        ConfigurationTemplateReplace(configPlatformMappingTemplate, replacemetSet, guid.ToString(), configuration, platform.Name);

                        if (platforms.ContainsKey(platform.BuildTarget))
                        {
                            replacemetSet = configPlatformEnabledTemplate.CreateReplacementSet(rootReplacementSet);
                            ConfigurationTemplateReplace(configPlatformEnabledTemplate, replacemetSet, guid.ToString(), configuration, platform.Name);
                        }
                    }
                }

                ProcessMappings(project.Guid, "InEditor", project.InEditorPlatforms);
                ProcessMappings(project.Guid, "Player", project.PlayerPlatforms);
            }

            foreach (CSProjectInfo project in unityProjectInfo.CSProjects.Values)
            {
                ExportProject(unityProjectInfo, project);
            }

            GenerateTopLevelDependenciesProject(unityProjectInfo);

            solutionFileTemplate.Write(solutionFilePath, rootReplacementSet);
        }
コード例 #3
0
 /// <summary>
 /// Adds given arbitrary <paramref name="token"/> to the output template.
 /// </summary>
 public OutputTemplateBuilder AddToken([NotNull] ITemplateToken token)
 {
     tokens.Add(token ?? throw new ArgumentNullException(nameof(token)));
     return(this);
 }