Last active
June 3, 2024 08:47
-
-
Save jimmywim/450d6e29d86101b3760d3d51a7dcf5b0 to your computer and use it in GitHub Desktop.
.net core code to read a SharePoint SPPKG file
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using MSPackage = System.IO.Packaging; | |
using System.Text; | |
using System.Threading.Tasks; | |
using System.Xml.Linq; | |
namespace Jimmywim.SharePoint.Packaging | |
{ | |
public class SPFxComponent | |
{ | |
public string Name { get; set; } = string.Empty; | |
public string Type { get; set; } = string.Empty; | |
public string Id { get; set; } = string.Empty; | |
} | |
public class SPFxPackage | |
{ | |
public string Name { get; set; } | |
public Version Version { get; set; } | |
public string ProductId { get; set; } | |
public List<SPFxComponent> Components { get; set; } = new List<SPFxComponent>(); | |
public static SPFxPackage LoadPackage(string path) | |
{ | |
using var package = System.IO.Packaging.Package.Open(path); | |
return ParsePackage(package); | |
} | |
public static SPFxPackage LoadPackage(byte[] packageBytes) | |
{ | |
using var memorystream = new System.IO.MemoryStream(packageBytes); | |
using var package = MSPackage.Package.Open(memorystream); | |
return ParsePackage(package); | |
} | |
private static SPFxPackage ParsePackage(MSPackage.Package package) | |
{ | |
XNamespace spNs = "http://schemas.microsoft.com/sharepoint/"; | |
SPFxPackage spfxPackage = new SPFxPackage(); | |
var rels = package.GetRelationshipsByType("http://schemas.microsoft.com/sharepoint/2012/app/relationships/package-manifest"); | |
if (rels.Any()) | |
{ | |
var manifestRel = rels.First(); | |
var packagePart = package.GetPart(manifestRel.TargetUri); | |
using var partStream = packagePart.GetStream(); | |
XDocument xDoc = XDocument.Load(partStream); | |
var appElem = xDoc.Root; | |
var packageName = appElem.Attribute("Name").Value; | |
var packageId = appElem.Attribute("ProductID").Value; | |
var packageVersion = appElem.Attribute("Version").Value; | |
var packageRelationships = packagePart.GetRelationships(); | |
foreach(var packageRel in packageRelationships) | |
{ | |
var relPart = package.GetPart(packageRel.TargetUri); | |
using var relPartStream = relPart.GetStream(); | |
XDocument relxDoc = XDocument.Load(relPartStream); | |
var features = relPart.GetRelationshipsByType("http://schemas.microsoft.com/sharepoint/2012/app/relationships/feature-elementmanifest"); | |
foreach(var feature in features) | |
{ | |
var featurePart = package.GetPart(feature.TargetUri); | |
using var featureStream = featurePart.GetStream(); | |
XDocument featureXDoc = XDocument.Load(featureStream); | |
var componentXml = featureXDoc.Root.Element(spNs + "ClientSideComponent"); | |
if (componentXml != null) | |
{ | |
var componetName = componentXml.Attribute("Name").Value; | |
var componentId = componentXml.Attribute("Id").Value; | |
var componentType = componentXml.Attribute("Type").Value; | |
spfxPackage.Components.Add(new SPFxComponent | |
{ | |
Name = componetName, | |
Id = componentId, | |
Type = componentType, | |
}); | |
} | |
} | |
} | |
spfxPackage.Name = packageName; | |
spfxPackage.Version = new Version(packageVersion); | |
spfxPackage.ProductId = packageId; | |
return spfxPackage; | |
} | |
else | |
{ | |
throw new ArgumentOutOfRangeException($"Package appears not to be an SPFx package"); | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment