private static int ExecuteAction(ModulePackerOptions obj) { var directory = new DirectoryInfo(obj.DirectoryPath); if (!directory.Exists) { Console.Error.WriteLine($"The directory '{directory.FullName}' was not found"); return(-1); } List <FileInfo> packages; if (!string.IsNullOrEmpty(obj.ModuleName)) { packages = directory.GetFiles($"{obj.ModuleName}.*.nupkg").ToList(); } else { packages = directory.GetFiles("*.nupkg").ToList(); var firstGroup = packages.GroupBy(x => x.Name.Split('.').First()).First(); obj.ModuleName = firstGroup.Key; packages = firstGroup.ToList(); } if (!packages.Any()) { Console.Error.WriteLine("No packages found for {0}", obj.ModuleName); return(-1); } var actualPackage = packages.FirstOrDefault(x => Regex.Match(x.Name, $"^{obj.ModuleName}\\.[0-9]").Success); if (actualPackage != null) { Console.WriteLine("Package is already created at {0}", actualPackage.Name); if (packages.Count == 1) { return(-1); } packages.Remove(actualPackage); } var output = obj.Output; if (string.IsNullOrEmpty(output)) { output = Path.Combine(obj.DirectoryPath, obj.ModuleName); } var outputDirectory = new DirectoryInfo(output); if (outputDirectory.Exists) { outputDirectory.Delete(true); } outputDirectory.Create(); Console.WriteLine($"Packages that will be merged in directory {output}"); foreach (var fileInfo in packages) { Console.WriteLine($"\t{fileInfo.Name}"); } var builder = new PseudoNuspecBuilder(); foreach (var fileInfo in packages) { CopyNupkgToOutput(outputDirectory, obj.ModuleName, fileInfo.FullName, builder); } foreach (var includedReference in builder.IncludedReferences) { foreach (var dependency in builder.Dependencies) { var referenceDependency = dependency.Value.FirstOrDefault(x => x.Id.Equals(includedReference.Id, StringComparison.OrdinalIgnoreCase)); if (referenceDependency != null) { dependency.Value.Remove(referenceDependency); foreach (var includedReferenceDependency in includedReference.Dependencies) { if (dependency.Value.Any(x => x.Id.Equals(includedReferenceDependency.Id, StringComparison.OrdinalIgnoreCase))) { continue; } dependency.Value.Add(includedReferenceDependency); } var targetFolder = Path.Combine(outputDirectory.FullName, "lib", dependency.Key.ToNuGetFramework().GetShortFolderName()); foreach (var fileName in Directory.EnumerateFiles(includedReference.ContentPath)) { var relativePath = fileName.Remove(0, includedReference.ContentPath.Length + 1); var targetFileInfo = new FileInfo(Path.Combine(targetFolder, relativePath)); targetFileInfo.Directory.Create(); File.Copy(fileName, targetFileInfo.FullName); } } } Directory.Delete(includedReference.ContentPath, true); } using (var outputStream = File.Create(Path.Combine(outputDirectory.FullName, $"{obj.ModuleName}.nuspec"))) builder.Write(outputStream, obj.ModuleName); if (obj.DeleteSourcePackages) { Console.WriteLine("Cleanup, delete source packages..."); foreach (var fileInfo in packages) { fileInfo.Delete(); } } return(0); }
private static void CopyNupkgToOutput(DirectoryInfo directory, string moduleName, string packagePath, PseudoNuspecBuilder builder) { using (var sourceFile = ZipFile.OpenRead(packagePath)) { var nuspecFile = sourceFile.Entries.Single(x => x.Name.EndsWith(".nuspec")); TryParseFrameworkFromName(nuspecFile.Name, moduleName, out var framework); using (var stream = nuspecFile.Open()) { var reader = new NuspecCoreReader(stream); var id = reader.GetId(); if (framework == null) { if (Enum.TryParse <MazeFramework>(id.Split('.').Last(), out var fw)) { framework = fw; } else { Console.WriteLine($"Package {id} could not be associated to an Maze framework. It will be included as a reference."); var tempFolder = Path.Combine(directory.FullName, reader.GetId()); ExtractPackage(tempFolder, sourceFile); builder.IncludedReferences.Add(new IncludedReference { Dependencies = reader.GetDependencies().ToList(), ContentPath = tempFolder, Id = reader.GetId() }); return; } } builder.Import(reader, framework.Value); } var nuGetFramework = framework.Value.ToNuGetFramework(); ExtractPackage(Path.Combine(directory.FullName, "lib", nuGetFramework.GetShortFolderName()), sourceFile); } }