private static XmlTransformableDocument OpenSourceFile(string sourceFile) { try { XmlTransformableDocument transformableDocument = new XmlTransformableDocument(); transformableDocument.PreserveWhitespace = true; transformableDocument.Load(sourceFile); return(transformableDocument); } //catch (XmlException ex) //{ // VsService.OutputLine($"Failed to open {sourceFile}"); // throw; //} catch (Exception e) { VsService.OutputLine($"Failed to open {sourceFile}"); throw; } }
// disclaimer: visual studio doesn't support adding dependent file under linked file // so no dependent transformed config under linked app.config in designer private static void CreateConfigFiles(Project project, ProjectItem projectItem) { var appConfigName = projectItem.Name; var buildConfigurationNames = project.GetBuildConfigurationNames(); // get app.config directory. new transform config will be created there. string path; if (projectItem.IsLink()) { path = Directory.GetParent(projectItem.ContainingProject.FullName).FullName; } else { path = Directory.GetParent(projectItem.GetFullPath()).FullName; } foreach (var buildConfigurationName in buildConfigurationNames) { var dependentConfig = GetTransformConfigName(appConfigName, buildConfigurationName); var dependentConfigFullPath = Path.Combine(path, dependentConfig); // check if config file exist if (FileWrapper.Exists(dependentConfigFullPath)) { VsService.OutputLine($"File {dependentConfig} already exists"); } else { using (var file = FileWrapper.AppendText(dependentConfigFullPath)) { file.Write(DependencyConfigContent); } VsService.OutputLine($"File {dependentConfig} was added"); } // add it to project file anyway, in case it was deleted just from project file projectItem.ProjectItems.AddFromFile(dependentConfigFullPath); } }
//TODO:[Golan] - break this method to small pieces public static bool EditProjectFile(ProjectItem projectItem) { string relativePrefix = null; // get dte from project item var dte = projectItem.DTE; try { // hide UI changes dte.SuppressUI = true; var isLinkAppConfig = projectItem.IsLink(); var project = projectItem.ContainingProject; var createAsLinkedConfig = false; // check if its linked config if (isLinkAppConfig) { // display yes/no message to user. yes - add as linked configs; no - add as concrete configs var result = VsService.ShowMessageBox("Add as linked configs?", OLEMSGBUTTON.OLEMSGBUTTON_YESNO, OLEMSGICON.OLEMSGICON_QUERY); // store relative path relativePrefix = projectItem.GetRelativeDirectory(); if (result == MessageBoxResult.Yes) { createAsLinkedConfig = true; } } if (createAsLinkedConfig) { VsService.OutputLine("Add LinkedConfigFiles"); // since it's link files we only need to copy them as like files to project CreateLinkedConfigFiles(projectItem); } else { VsService.OutputLine("Add ConfigFiles"); // create missing config files CreateConfigFiles(project, projectItem); } // we need to know if we saved the file when displaying message to user var changed = project.IsDirty; // save before making external changes to file if (changed) { project.Save(); } // project file(e.g. c:\myproject\myproject.csproj) var fileName = project.FullName; // config name (e.g. app.config or logging.config) var configName = projectItem.Name; ProjectXmlTransform.Open(fileName); VsService.OutputLine("Add UsingTask"); ProjectXmlTransform.AddTransformTask(); if (IsRootAppConfig(configName)) { VsService.OutputLine("Add AfterCompileTarget"); ProjectXmlTransform.AddAfterCompileTarget(configName, relativePrefix, createAsLinkedConfig); VsService.OutputLine("Add AfterPublishTarget"); // project is a windows application or console application? if so add click once transform task ProjectXmlTransform.AddAfterPublishTarget(configName, relativePrefix, createAsLinkedConfig); } else { VsService.OutputLine("Add AfterBuildTarget"); ProjectXmlTransform.AddAfterBuildTarget(configName, relativePrefix, createAsLinkedConfig); } VsService.OutputLine("Check if need to save project file"); // save project file var isSaved = ProjectXmlTransform.Save(); // check if need to reload project, remember that we edit the project file externally if (isSaved) { VsService.OutputLine("Done saving project file"); VsService.OutputLine("Reloading project file"); project.SaveReloadProject(); } else { VsService.OutputLine("No changes made in project file"); } return(changed || isSaved); } finally { dte.SuppressUI = false; } }