private Dictionary <BridgeResourceInfo, byte[]> PrepareAndExtractResources(string outputPath, string projectPath, Dictionary <string, string> files) { var resourcesToEmbed = new Dictionary <BridgeResourceInfo, byte[]>(); if (this.AssemblyInfo.Resources.HasEmbedResources()) { // There are resources defined in the config so let's grab files // Find all items and put in the order this.Log.Trace("Preparing resources specified in config..."); foreach (var resource in this.AssemblyInfo.Resources.EmbedItems) { this.Log.Trace("Preparing resource " + resource.Name); if (resource.Inject != true && resource.Extract != true) { this.Log.Trace("Skipping the resource as it has inject != true and extract != true"); continue; } using (var resourceBuffer = new MemoryStream(500 * 1024)) { this.GenerateResourseHeader(resourceBuffer, resource, projectPath); this.ReadResourseFiles(projectPath, resourceBuffer, resource); if (resourceBuffer.Length > 0) { this.Log.Trace("Prepared files for resource " + resource.Name); var code = resourceBuffer.ToArray(); var info = new BridgeResourceInfo { Name = resource.Name, FileName = resource.Name, Path = string.IsNullOrWhiteSpace(resource.Output) ? null : resource.Output }; resourcesToEmbed.Add(info, code); this.ExtractResource(outputPath, projectPath, resource, code); } else { this.Log.Error("No files found for resource " + resource.Name); } } this.Log.Trace("Done preparing resource " + resource.Name); } this.Log.Trace("Done preparing resources specified in config..."); } else { // There are no resources defined in the config so let's just grab files this.Log.Trace("Preparing output files for resources"); foreach (var file in files) { try { this.Log.Trace("Reading output file " + file.Value); var content = File.ReadAllBytes(file.Value); var info = new BridgeResourceInfo { Name = file.Key, FileName = file.Key, Path = null }; resourcesToEmbed.Add(info, content); this.Log.Trace("Read " + content.Length + " bytes"); } catch (Exception ex) { this.Log.Error(ex.ToString()); throw; } } this.Log.Trace("Done preparing output files for resources"); } return(resourcesToEmbed); }
protected virtual void AddReferencedOutput(string outputPath, AssemblyDefinition assembly, BridgeResourceInfo resource, string fileName, Func <string, string> preHandler = null) { this.Log.Trace("Adding referenced output " + resource.Name); var currentAssembly = GetAssemblyNameForResource(assembly); var combinedResource = (resource.Parts != null && resource.Parts.Length > 0); TranslatorOutputItemContent content = null; if (combinedResource) { this.Log.Trace("The resource contains parts"); var contentBuffer = new StringBuilder(); var needNewLine = false; var noConsole = this.AssemblyInfo.Console.Enabled != true; var fileHelper = new FileHelper(); foreach (var part in resource.Parts) { this.Log.Trace("Handling part " + part.Assembly + " " + part.ResourceName); bool needPart = true; System.Reflection.AssemblyName partAssemblyName = null; if (part.Assembly != null) { partAssemblyName = GetAssemblyNameFromResource(part.Assembly); if (noConsole && partAssemblyName.Name == Translator.Bridge_ASSEMBLY && (string.Compare(part.Name, BridgeConsoleName, true) == 0 || string.Compare(part.Name, fileHelper.GetMinifiedJSFileName(BridgeConsoleName), true) == 0) ) { // Skip Bridge console resource needPart = false; this.Log.Trace("Skipping this part as it is Bridge Console and the Console option disabled"); } else { var partContentName = GetExtractedResourceName(part.Assembly, part.Name); needPart = ExtractedScripts.Add(partContentName); if (!needPart) { this.Log.Trace("Skipping this part as it is already added"); } } } if (needPart) { if (needNewLine) { NewLine(contentBuffer); } string partContent = null; var resourcePartName = part.ResourceName; if (partAssemblyName == null) { this.Log.Trace("Using assembly " + assembly.FullName + " to search resource part " + resourcePartName); partContent = ReadEmbeddedResource(assembly, resourcePartName, true, preHandler).Item2; } else { var partAssembly = this.References .Where(x => x.Name.Name == partAssemblyName.Name) .OrderByDescending(x => x.Name.Version) .FirstOrDefault(); if (partAssembly == null) { this.Log.Warn("Did not find assembly for resource part " + resourcePartName + " by assembly name " + partAssemblyName.Name + ". Skipping this item!"); continue; } if (partAssembly.Name.Version != partAssemblyName.Version) { this.Log.Info("Found different assembly version (higher) " + partAssembly.FullName + " for resource part" + resourcePartName + " from " + assembly.FullName); } else { this.Log.Trace("Found exact assembly version " + partAssembly.FullName + " for resource part" + resourcePartName); } var resourcePartFound = false; try { partContent = ReadEmbeddedResource(partAssembly, resourcePartName, true, preHandler).Item2; resourcePartFound = true; } catch (InvalidOperationException) { this.Log.Trace("Did not find resource part " + resourcePartName + " in " + partAssembly.FullName + ". Will try to find it by short name " + part.Name); } if (!resourcePartFound) { try { partContent = ReadEmbeddedResource(partAssembly, part.Name, true, preHandler).Item2; resourcePartFound = true; } catch (InvalidOperationException) { this.Log.Trace("Did not find resource part " + part.Name + " in " + partAssembly.FullName); } if (!resourcePartFound) { if (partAssembly.Name.Version != partAssemblyName.Version) { var partAssemblyExactVersion = this.References .Where(x => x.FullName == partAssemblyName.FullName) .FirstOrDefault(); if (partAssemblyExactVersion != null) { this.Log.Trace("Trying to find it in the part's assembly by long name " + part.Name); try { partContent = ReadEmbeddedResource(partAssemblyExactVersion, resourcePartName, true, preHandler).Item2; resourcePartFound = true; } catch (InvalidOperationException) { this.Log.Trace("Did not find resource part " + resourcePartName + " in " + partAssemblyExactVersion.FullName + ". Will try to find it by short name " + part.Name); } if (!resourcePartFound) { try { partContent = ReadEmbeddedResource(partAssemblyExactVersion, part.Name, true, preHandler).Item2; resourcePartFound = true; } catch (InvalidOperationException) { this.Log.Trace("Did not find resource part " + part.Name + " in " + partAssemblyExactVersion.FullName + ". Will try to find it by the resource's assembly by long name " + resourcePartName); } } } } if (!resourcePartFound) { partContent = ReadEmbeddedResource(assembly, resourcePartName, true, preHandler).Item2; resourcePartFound = true; } } } } contentBuffer.Append(partContent); needNewLine = true; } } content = contentBuffer; } else { var readAsString = FileHelper.IsJS(fileName) || preHandler != null; var notCombinedResource = ReadEmbeddedResource(assembly, resource.Name, readAsString, preHandler); if (readAsString) { content = notCombinedResource.Item2; } else { content = notCombinedResource.Item1; } } ExtractedScripts.Add(GetExtractedResourceName(currentAssembly, resource.Name)); Emitter.AddOutputItem(this.Outputs.References, fileName, content, TranslatorOutputKind.Reference, location: outputPath, assembly: currentAssembly); }
private IEnumerable <Tuple <BridgeResourceInfo, byte[]> > PrepareAndExtractResources(string outputPath, string projectPath) { if (this.AssemblyInfo.Resources.HasEmbedResources()) { // There are resources defined in the config so let's grab files // Find all items and put in the order this.Log.Trace("Preparing resources specified in config..."); foreach (var resource in this.AssemblyInfo.Resources.EmbedItems) { this.Log.Trace("Preparing resource " + resource.Name); if (resource.Inject != true && resource.Extract != true) { this.Log.Trace("Skipping the resource as it has inject != true and extract != true"); continue; } using (var resourceBuffer = new MemoryStream(500 * 1024)) { this.GenerateResourseHeader(resourceBuffer, resource, projectPath); var needSourceMap = this.ReadResourseFiles(projectPath, resourceBuffer, resource); if (resourceBuffer.Length > 0) { this.Log.Trace("Prepared file items for resource " + resource.Name); var resourcePath = GetFullPathForResource(outputPath, resource); var code = resourceBuffer.ToArray(); if (needSourceMap) { TranslatorOutputItemContent content = code; var fullPath = Path.GetFullPath(Path.Combine(resourcePath.Item1, resourcePath.Item2)); content = GenerateSourceMap(fullPath, content.GetContentAsString()); code = content.GetContentAsBytes(); } this.ExtractResource(resourcePath.Item1, resourcePath.Item2, resource, code); var info = new BridgeResourceInfo { Name = resource.Name, FileName = resource.Name, Path = string.IsNullOrWhiteSpace(resource.Output) ? null : resource.Output }; yield return(Tuple.Create(info, code)); } else { this.Log.Error("No files found for resource " + resource.Name); } } this.Log.Trace("Done preparing resource " + resource.Name); } this.Log.Trace("Done preparing resources specified in config..."); } else { // There are no resources defined in the config so let's just grab files this.Log.Trace("Preparing outputs for resources"); foreach (var outputItem in this.Outputs.GetOutputs(true)) { this.Log.Trace("Getting output " + outputItem.FullPath.LocalPath); var info = new BridgeResourceInfo { Name = outputItem.Name, FileName = outputItem.Name, Path = null }; byte[] content; if (!outputItem.HasGeneratedSourceMap) { this.Log.Trace("The output item does not have HasGeneratedSourceMap so we use it right from the Outputs"); content = outputItem.Content.GetContentAsBytes(); this.Log.Trace("The output is of content " + content.Length + " length"); } else { this.Log.Trace("Reading content file as the output has HasGeneratedSourceMap"); content = File.ReadAllBytes(outputItem.FullPath.LocalPath); this.Log.Trace("Read " + content.Length + " bytes for " + info.Name); } yield return(Tuple.Create(info, content)); } this.Log.Trace("Done preparing output files for resources"); } }