public SourceCodeDownloadService(ModuleProjectBuilder moduleProjectBuilder, NugetPackageProjectBuilder nugetPackageProjectBuilder, NpmPackageProjectBuilder npmPackageProjectBuilder) { ModuleProjectBuilder = moduleProjectBuilder; NugetPackageProjectBuilder = nugetPackageProjectBuilder; NpmPackageProjectBuilder = npmPackageProjectBuilder; Logger = NullLogger <SourceCodeDownloadService> .Instance; }
public async Task DownloadNugetPackageAsync(string packageName, string outputFolder, string version) { Logger.LogInformation("Downloading source code of " + packageName); Logger.LogInformation("Version: " + version); Logger.LogInformation("Output folder: " + outputFolder); var result = await NugetPackageProjectBuilder.BuildAsync( new ProjectBuildArgs( SolutionName.Parse(packageName), packageName, version, outputFolder ) ); using (var templateFileStream = new MemoryStream(result.ZipContent)) { using (var zipInputStream = new ZipInputStream(templateFileStream)) { var zipEntry = zipInputStream.GetNextEntry(); while (zipEntry != null) { var fullZipToPath = Path.Combine(outputFolder, zipEntry.Name); var directoryName = Path.GetDirectoryName(fullZipToPath); if (!string.IsNullOrEmpty(directoryName)) { Directory.CreateDirectory(directoryName); } var fileName = Path.GetFileName(fullZipToPath); if (fileName.Length == 0) { zipEntry = zipInputStream.GetNextEntry(); continue; } var buffer = new byte[4096]; // 4K is optimum using (var streamWriter = File.Create(fullZipToPath)) { StreamUtils.Copy(zipInputStream, streamWriter, buffer); } zipEntry = zipInputStream.GetNextEntry(); } } } Logger.LogInformation($"'{packageName}' has been successfully downloaded to '{outputFolder}'"); }