diff --git a/.cspell.jsonc b/.cspell.jsonc index 43622dd..3d8a809 100644 --- a/.cspell.jsonc +++ b/.cspell.jsonc @@ -4,6 +4,9 @@ "Authenticode", "davidanson", "devcontainers", + "msix", + "msixbundle", + "netstandard", "Nieto", "Roamable", "runneradmin", diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 824f5b0..357e075 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,6 +21,17 @@ jobs: - name: Checkout Repository uses: actions/checkout@v4 + - name: Install AnyPackage.NuGet + run: Install-PSResource AnyPackage.NuGet -TrustRepository + + - name: Download Microsoft.Msix.Utils NuGet Package + run: | + Import-Module AnyPackage.NuGet + Save-Package Microsoft.Msix.Utils + + - name: Copy Microsoft.Msix.Utils.dll to src + run: Copy-Item ./Microsoft.Msix.Utils*/lib/netstandard2.0/Microsoft.Msix.Utils.dll ./src + - name: Upload module uses: actions/upload-artifact@v4 with: diff --git a/src/AnyPackage.Appx.psd1 b/src/AnyPackage.Appx.psd1 index e5ec7e8..a2dab24 100644 --- a/src/AnyPackage.Appx.psd1 +++ b/src/AnyPackage.Appx.psd1 @@ -10,6 +10,7 @@ RequiredModules = @( @{ ModuleName = 'AnyPackage'; ModuleVersion = '0.9.0' }, 'Appx') + RequiredAssemblies = @('Microsoft.Msix.Utils.dll') FunctionsToExport = @() CmdletsToExport = @() AliasesToExport = @() diff --git a/src/AnyPackage.Appx.psm1 b/src/AnyPackage.Appx.psm1 index 210d46d..e785916 100644 --- a/src/AnyPackage.Appx.psm1 +++ b/src/AnyPackage.Appx.psm1 @@ -7,11 +7,34 @@ using module Appx using namespace AnyPackage.Provider using namespace Windows.Management.Deployment using namespace Microsoft.Windows.Appx.PackageManager.Commands +using namespace Microsoft.Msix.Utils.AppxPackaging +using namespace System.IO -[PackageProvider('Appx')] -class AppxProvider : PackageProvider, IGetPackage, IUninstallPackage { +[PackageProvider('Appx', PackageByName = $false, FileExtensions = ('.appx', '.msix', '.msixbundle'))] +class AppxProvider : PackageProvider, IFindPackage, IGetPackage, IUninstallPackage { [string[]] $Members = @() + [void] FindPackage([PackageRequest] $request) { + $appx = if ([Path]::GetExtension($request.Path) -eq '.msixbundle') { + [AppxBundleMetadata]::new($request.Path) + } else { + [AppxMetadata]::new($request.Path) + } + + $metadata = @{ } + $properties = $appx | + Get-Member -Type Properties | + Select-Object -ExpandProperty Name + + foreach ($member in $properties) { + $metadata[$member] = $appx.$member + } + + $source = [PackageSourceInfo]::new($request.Path, $request.Path, $request.ProviderInfo) + $package = [PackageInfo]::new($appx.PackageName, $appx.Version.ToString(), $source, $appx.DisplayName, $null, $metadata, $request.ProviderInfo) + $request.WritePackage($package) + } + [void] GetPackage([PackageRequest] $request) { $getAppxPackageParams = @{ Name = $request.Name }