public void Run() { var extensionConfigPath = arguments["extension"].Trim(); var workingDirectory = arguments["directory"].Trim(); if (!File.Exists(extensionConfigPath)) { log.ErrorFormat("The extension configuration file '{0}' doesn't exist", extensionConfigPath); return; } if (!Directory.Exists(workingDirectory)) { log.ErrorFormat("Directory '{0}' doesn't exist", workingDirectory); return; } var builder = new ExtensionBuilder(); var fileInfo = new FileInfo(extensionConfigPath); var extensionConfig = ProjectConfiguration.Create(fileInfo.FullName); if (string.IsNullOrEmpty(extensionConfig.Name)) { log.ErrorFormat("The extension needs a name, build cancelled"); return; } log.InfoFormat("Building extension {0}.", extensionConfig.Name); var extensionFile = Path.Combine(fileInfo.DirectoryName, extensionConfig.Name + ".zip"); builder.BuildExtension(fileInfo.DirectoryName, extensionFile); var projectFiles = Directory .GetFiles(workingDirectory, "Project.config", SearchOption.AllDirectories) .Where(s => s != fileInfo.FullName && !s.Contains(@"\bin\")); foreach (var projectFile in projectFiles) { var projectInfo = new FileInfo(projectFile); var projectConfig = ProjectConfiguration.Create(projectInfo.FullName); if (projectConfig.Dependencies.Contains(extensionConfig.Name)) { var httpContext = new HttpContextMock("/"); var projectContext = new SageContext(httpContext, delegate(string path) { path = path.ReplaceAll("^~?/", string.Empty).ReplaceAll("/", "\\"); if (!Path.IsPathRooted(path)) path = Path.Combine(projectInfo.DirectoryName, path); return path; }, projectConfig); string installPath = Path.Combine(projectContext.Path.ExtensionPath, Path.GetFileName(extensionFile)); File.Copy(extensionFile, installPath, true); } } }
public void Run() { var directories = arguments["directory"].Trim().Split('+'); var projectFiles = new List<string>(); foreach (var path in directories) { if (!Directory.Exists(path)) { log.ErrorFormat("Directory '{0}' doesn't exist", path); return; } projectFiles.AddRange(Directory .GetFiles(path, "Project.config", SearchOption.AllDirectories) .Where(s => !s.Contains(@"\bin\")) ); } log.InfoFormat("Building all extension projects in {0}.", string.Join(", ", directories)); var temporaryDir = Path.Combine(directories[0], "temp"); Directory.CreateDirectory(temporaryDir); var extensions = new Dictionary<string, string>(); var projects = new Dictionary<string, ProjectInfo>(); var builder = new ExtensionBuilder(); foreach (var projectFile in projectFiles) { var fileInfo = new FileInfo(projectFile); var projectConfig = ProjectConfiguration.Create(fileInfo.FullName); // skip extension projects if (projectConfig.Name == "$projectname$") continue; var projectName = projectConfig.Name ?? string.Format("Project.{0}.{1}", fileInfo.Directory.Name, projects.Count + 1); var projectPath = Path.GetDirectoryName(projectFile); if (projectConfig.Type == ProjectType.ExtensionProject) { var targetPath = Path.Combine(temporaryDir, projectName + ".zip"); builder.BuildExtension(projectPath, targetPath); extensions.Add(projectName, targetPath); } projects.Add(projectName, new ProjectInfo { Name = projectName, Path = projectPath, Config = projectConfig, Dependencies = projectConfig.Dependencies }); } List<string> visitedProjects = new List<string>(); Action<ProjectInfo> copyDependencies = null; copyDependencies = projectInfo => { if (visitedProjects.Contains(projectInfo.Name)) return; SageContext context = Program.CreateSageContext("/", projectInfo.Config, path => { if (path == "/") path = "~/"; string result = path .Replace("~", projectInfo.Path) .Replace("//", "/") .Replace("/", "\\"); return new FileInfo(result).FullName; }); foreach (string extensionName in projectInfo.Dependencies) { if (!extensions.ContainsKey(extensionName)) { log.ErrorFormat("Extension {0} (dependency of project {1}) could not be found", extensionName, projectInfo.Name); continue; } string extensionFile = extensions[extensionName]; string targetPath = Path.Combine(context.Path.ExtensionPath, Path.GetFileName(extensionFile)); if (!Directory.Exists(Path.GetDirectoryName(targetPath))) Directory.CreateDirectory(Path.GetDirectoryName(targetPath)); File.Copy(extensionFile, targetPath, true); log.InfoFormat("Copied extension {0} to project {1}", extensionName, projectInfo.Name); log.DebugFormat("\t({0})", targetPath); ProjectInfo info = projects[extensionName]; copyDependencies(info); } visitedProjects.Add(projectInfo.Name); }; projects.Values.Each(copyDependencies); try { var attempts = 0; while (++attempts < 6) { Directory.Delete(temporaryDir); if (Directory.Exists(temporaryDir)) Thread.Sleep(TimeSpan.FromSeconds(.1)); if (!Directory.Exists(temporaryDir)) break; } } catch (IOException ex) { log.WarnFormat("Failed to delete temporary directory '{0}': {1}", temporaryDir, ex.Message); } }