internal PackageResourceDependencies(PackageExplorer packageExplorer, PackageResourceMetadataModel metadataModel) { this.packageExplorer = packageExplorer; dependencies = new List <PackageResourceDependency>(); if (metadataModel.Dependencies != null) { foreach (var importerDependency in metadataModel.Dependencies) { dependencies.Add( new PackageResourceDependency(packageExplorer, importerDependency)); } } }
public void PerformBuild(IArchiveDirectory destination) { var serializer = new JsonSerializer() { Formatting = Formatting.None }; var manifest = destination.Files.GetFile("definition.json"); using (var zipStream = manifest.OpenWrite()) { var packageDefinition = new PackageDefinition(new PackageDefinitionProperties() { Name = Project.Definition?.Properties.Name, Version = Project.Definition?.Properties.Version }); string json = JsonConvert.SerializeObject(packageDefinition); byte[] bytes = Encoding.UTF8.GetBytes(json); zipStream.Write(bytes, 0, bytes.Length); } var tagsEntry = destination.Files.GetFile("tags.json"); var tagsDocument = new Dictionary <string, List <string> >(); foreach (var projectTagCategory in Project.Tags) { if (!tagsDocument.TryGetValue(projectTagCategory.Key, out var taggedResources)) { taggedResources = new List <string>(); tagsDocument[projectTagCategory.Key] = taggedResources; } taggedResources.AddRange(projectTagCategory.Value.Select(tag => tag.FullName)); } WriteJsonDocument(tagsEntry, tagsDocument); long currentProgress = 0; var maxThread = new SemaphoreSlim(destination.Archive.MaximumWriteThreads); var tasks = new List <Task>(); int failed = 0; foreach (var resource in Project.Resources) { maxThread.Wait(); tasks.Add(Task.Factory.StartNew(() => { var exporter = Pipeline.GetExporter(resource); string contentName = $"data/{resource.FullName}"; string metadataName = $"data/{resource.FullName}.pkgmeta"; Pipeline.BuildActions.OnBeforeExportResource(this, resource); if (exporter == null) { // contentEntry = archive.CreateEntryFromFile(resource.Content.ArchiveEntry.FullName, contentName, CompressionLevel.Optimal); var contentEntry = destination.Files.GetFile(contentName); using var stream = resource.Content.LoadStream(); using var zipStream = contentEntry.OpenWrite(); stream.CopyTo(zipStream); } else { try { exporter.BuildResource(resource, destination); } catch (Exception exception) { Console.WriteLine($"ERROR: Failed to export {resource.FullName}: {exception}"); failed++; } } var dependencies = new PackageResourceMetadataDependencyModel[resource.Dependencies.Count]; for (int i = 0; i < dependencies.Length; i++) { var dependency = resource.Dependencies[i]; dependencies[i] = new PackageResourceMetadataDependencyModel() { Resource = dependency.Key }; } var metadata = new PackageResourceMetadataModel() { Dependencies = dependencies }; var metadataEntry = destination.Files.GetFile(metadataName); using (var zipStream = metadataEntry.OpenWrite()) using (var streamWriter = new StreamWriter(zipStream)) { serializer.Serialize(streamWriter, metadata); } currentProgress += resource.UncompressedSize; Progress = currentProgress / (double)Project.UncompressedSize; Pipeline.BuildActions.OnAfterExportResource(this, resource); }, TaskCreationOptions.LongRunning) .ContinueWith((task) => { tasks.Remove(task); return(maxThread.Release()); })); } Task.WaitAll(tasks.ToArray()); if (failed > 0) { throw new InvalidOperationException($"Failed to export {failed} resources."); } }
internal PackageResource(PackageExplorer packageExplorer, PackageDirectory directory, IReadOnlyArchiveFile contentEntry, PackageResourceMetadataModel metadataModel) { Explorer = packageExplorer; Directory = directory; Dependencies = new PackageResourceDependencies(packageExplorer, metadataModel); Tags = new PackageResourceTags(); Name = contentEntry.Name; string withoutData = contentEntry.FullName.Substring(5); FullName = withoutData; Content = new PackageResourceContent(packageExplorer, contentEntry.FullName, contentEntry); int dotIndex = contentEntry.FullName.LastIndexOf('.'); Extension = dotIndex != -1 ? contentEntry.FullName.Substring(dotIndex) : null; }