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); }
/// <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); }