private static async Task <IEnumerable <string> > CopySatelliteFilesAsync( PackageReaderBase packageReader, PackagePathResolver packagePathResolver, PackageSaveMode packageSaveMode, PackageExtractionContext packageExtractionContext, CancellationToken token) { if (packageReader == null) { throw new ArgumentNullException(nameof(packageReader)); } if (packagePathResolver == null) { throw new ArgumentNullException(nameof(packagePathResolver)); } if (packageExtractionContext == null) { throw new ArgumentNullException(nameof(packageExtractionContext)); } await VerifyPackageSignatureAsync(packageReader.GetIdentity(), packageExtractionContext, packageReader, token); var satelliteFilesCopied = Enumerable.Empty <string>(); var result = await PackageHelper.GetSatelliteFilesAsync(packageReader, packagePathResolver, token); var runtimePackageDirectory = result.Item1; var satelliteFiles = result.Item2 .Where(file => PackageHelper.IsPackageFile(file, packageSaveMode)) .ToList(); if (satelliteFiles.Count > 0) { var packageFileExtractor = new PackageFileExtractor(satelliteFiles, packageExtractionContext.XmlDocFileSaveMode); // Now, add all the satellite files collected from the package to the runtime package folder(s) satelliteFilesCopied = await packageReader.CopyFilesAsync( runtimePackageDirectory, satelliteFiles, packageFileExtractor.ExtractPackageFile, packageExtractionContext.Logger, token); } return(satelliteFilesCopied); }
public static IEnumerable <string> ExtractPackage( PackageReaderBase packageReader, Stream packageStream, PackagePathResolver packagePathResolver, PackageExtractionContext packageExtractionContext, CancellationToken token) { if (packageStream == null) { throw new ArgumentNullException(nameof(packageStream)); } if (packagePathResolver == null) { throw new ArgumentNullException(nameof(packagePathResolver)); } if (packageExtractionContext == null) { throw new ArgumentNullException(nameof(packageExtractionContext)); } var packageSaveMode = packageExtractionContext.PackageSaveMode; var nupkgStartPosition = packageStream.Position; var filesAdded = new List <string>(); var packageIdentityFromNuspec = packageReader.GetIdentity(); var packageDirectoryInfo = Directory.CreateDirectory(packagePathResolver.GetInstallPath(packageIdentityFromNuspec)); var packageDirectory = packageDirectoryInfo.FullName; var packageFiles = packageReader.GetPackageFiles(packageSaveMode); var packageFileExtractor = new PackageFileExtractor(packageFiles, packageExtractionContext.XmlDocFileSaveMode); filesAdded.AddRange(packageReader.CopyFiles( packageDirectory, packageFiles, packageFileExtractor.ExtractPackageFile, packageExtractionContext.Logger, token)); var nupkgFilePath = Path.Combine(packageDirectory, packagePathResolver.GetPackageFileName(packageIdentityFromNuspec)); if (packageSaveMode.HasFlag(PackageSaveMode.Nupkg)) { // During package extraction, nupkg is the last file to be created // Since all the packages are already created, the package stream is likely positioned at its end // Reset it to the nupkgStartPosition if (packageStream.Position != 0) { if (!packageStream.CanSeek) { throw new ArgumentException(Strings.PackageStreamShouldBeSeekable); } packageStream.Position = 0; } filesAdded.Add(packageStream.CopyToFile(nupkgFilePath)); } // Now, copy satellite files unless requested to not copy them if (packageExtractionContext.CopySatelliteFiles) { filesAdded.AddRange(CopySatelliteFiles( packageReader, packagePathResolver, packageSaveMode, packageExtractionContext, token)); } return(filesAdded); }