Skip to content

Commit 0563b4a

Browse files
Port shared layers to net8 and stabilize release workflow (#4453)
* Port shared layers to net8 and stabilize release workflow - port non-UI core, interface, package engine, and test projects toward cross-platform net8 targets - add the portable Avalonia solution and fix Windows x64 and arm64 solution targeting - update versioning, integrity, and build scripts for the new PowerShell-based workflow - repair release and test workflows, including manifest stamping and Node 24 action upgrades * Restore Windows executable fallback path
1 parent bc8131c commit 0563b4a

69 files changed

Lines changed: 894 additions & 446 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/build-release.yml

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ jobs:
3636

3737
steps:
3838
- name: Checkout
39-
uses: actions/checkout@v4
39+
uses: actions/checkout@v6
4040

4141
- name: Resolve build parameters
4242
id: info
@@ -98,7 +98,7 @@ jobs:
9898

9999
steps:
100100
- name: Checkout
101-
uses: actions/checkout@v4
101+
uses: actions/checkout@v6
102102

103103
- name: Install Windows SDK UAP platform
104104
shell: pwsh
@@ -119,7 +119,7 @@ jobs:
119119
dotnet-version: 8.0.x
120120

121121
- name: Install Python
122-
uses: actions/setup-python@v5
122+
uses: actions/setup-python@v6
123123
with:
124124
python-version: '3.x'
125125

@@ -149,7 +149,7 @@ jobs:
149149
150150
- name: Restore WinGet CLI cache
151151
id: winget-cache
152-
uses: actions/cache/restore@v4
152+
uses: actions/cache/restore@v5
153153
with:
154154
path: src/UniGetUI.PackageEngine.Managers.WinGet/winget-cli_${{ matrix.platform }}
155155
key: winget-cli-${{ runner.os }}-${{ matrix.platform }}-${{ hashFiles('scripts/fetch-winget-cli.ps1') }}
@@ -165,32 +165,32 @@ jobs:
165165
166166
- name: Save WinGet CLI cache
167167
if: steps.winget-cache.outputs.cache-hit != 'true'
168-
uses: actions/cache/save@v4
168+
uses: actions/cache/save@v5
169169
with:
170170
path: src/UniGetUI.PackageEngine.Managers.WinGet/winget-cli_${{ matrix.platform }}
171171
key: ${{ steps.winget-cache.outputs.cache-primary-key }}
172172

173173
- name: Restore dependencies
174174
working-directory: src
175-
run: dotnet restore
175+
run: dotnet restore UniGetUI.sln
176176

177177
- name: Run tests
178178
working-directory: src
179179
shell: pwsh
180180
run: |
181181
# Retry once to handle flaky tests (e.g. TaskRecyclerTests uses Random)
182-
dotnet test --no-restore --verbosity q --nologo
182+
dotnet test UniGetUI.sln --no-restore --verbosity q --nologo
183183
if ($LASTEXITCODE -ne 0) {
184184
Write-Host "::warning::First test run failed, retrying..."
185-
dotnet test --no-restore --verbosity q --nologo
185+
dotnet test UniGetUI.sln --no-restore --verbosity q --nologo
186186
if ($LASTEXITCODE -ne 0) { exit 1 }
187187
}
188188
189189
- name: Publish
190190
shell: pwsh
191191
run: |
192192
$Platform = '${{ matrix.platform }}'
193-
dotnet publish src/UniGetUI/UniGetUI.csproj /noLogo /p:Configuration=Release /p:Platform=$Platform -v m
193+
dotnet publish src/UniGetUI/UniGetUI.csproj /noLogo /p:Configuration=Release /p:Platform=$Platform -p:RuntimeIdentifier=win-$Platform -v m
194194
if ($LASTEXITCODE -ne 0) { throw "dotnet publish failed" }
195195
196196
# Stage binaries
@@ -276,7 +276,7 @@ jobs:
276276
-TimestampServer '${{ vars.CODE_SIGNING_TIMESTAMP_SERVER }}'
277277
278278
- name: Upload artifacts
279-
uses: actions/upload-artifact@v4
279+
uses: actions/upload-artifact@v7
280280
with:
281281
name: UniGetUI-release-${{ matrix.platform }}
282282
path: output/*
@@ -298,7 +298,7 @@ jobs:
298298

299299
steps:
300300
- name: Download artifacts
301-
uses: actions/download-artifact@v4
301+
uses: actions/download-artifact@v8
302302
with:
303303
path: output
304304

.github/workflows/dotnet-test.yml

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,31 @@ jobs:
3434
with:
3535
dotnet-version: 8.0.x
3636

37+
- name: Install Windows SDK UAP platform
38+
shell: pwsh
39+
run: |
40+
# CsWinRT in WindowsPackageManager.Interop requires UAP 10.0.19041.0 platform metadata
41+
$VsWhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
42+
$VsInstaller = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vs_installer.exe"
43+
$InstallPath = & $VsWhere -latest -property installationPath
44+
& $VsInstaller modify --installPath $InstallPath `
45+
--add Microsoft.VisualStudio.Component.UWP.Support `
46+
--add Microsoft.VisualStudio.Component.Windows10SDK.19041 `
47+
--quiet --norestart --nocache | Out-Default
48+
Write-Host "Windows SDK UAP platform installed"
49+
3750
# - name: Install WinGet
3851
# uses: Cyberboss/install-winget@v1
3952

4053
- name: Install dependencies
4154
working-directory: src
42-
run: dotnet restore
55+
run: dotnet restore UniGetUI.sln
4356

4457
# - name: Test build
4558
# working-directory: src
4659
# run: dotnet build --configuration Release
4760

4861
- name: Run Tests
4962
working-directory: src
50-
run: dotnet test --no-restore --verbosity q --nologo
63+
run: dotnet test UniGetUI.sln --no-restore --verbosity q --nologo
5164

AGENTS.md

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# UniGetUI ΓÇô Copilot Instructions
1+
# UniGetUI - Copilot Instructions
22

33
## Project Overview
44

@@ -8,13 +8,13 @@ UniGetUI is a WinUI 3 desktop app (C#/.NET 8, Windows App SDK) providing a GUI f
88

99
The codebase follows a **layered, modular structure** with ~40 projects:
1010

11-
- **`UniGetUI/`** ΓÇô WinUI 3 entry point, XAML pages, controls, and app shell (`EntryPoint.cs`, `MainWindow.xaml`)
12-
- **`UniGetUI.Core.*`** ΓÇô Shared infrastructure: `Logger`, `Settings`, `Tools` (includes `CoreTools.Translate()`), `IconEngine`, `LanguageEngine`
13-
- **`UniGetUI.PackageEngine.Interfaces`** ΓÇô Contracts: `IPackageManager`, `IPackage`, `IManagerSource`, `IPackageDetails`
14-
- **`UniGetUI.PackageEngine.PackageManagerClasses`** ΓÇô Base implementations: `PackageManager` (abstract), `Package`, helpers (`BasePkgDetailsHelper`, `BasePkgOperationHelper`, `BaseSourceHelper`)
15-
- **`UniGetUI.PackageEngine.Managers.*`** ΓÇô Concrete manager implementations (one project per manager: `WinGet`, `Scoop`, `Chocolatey`, `Pip`, `Npm`, etc.)
16-
- **`UniGetUI.PackageEngine.Operations`** ΓÇô Install/update/uninstall operation orchestration
17-
- **`UniGetUI.Interface.*`** ΓÇô Enums, telemetry, background API
11+
- **`UniGetUI/`** - WinUI 3 entry point, XAML pages, controls, and app shell (`EntryPoint.cs`, `MainWindow.xaml`)
12+
- **`UniGetUI.Core.*`** - Shared infrastructure: `Logger`, `Settings`, `Tools` (includes `CoreTools.Translate()`), `IconEngine`, `LanguageEngine`
13+
- **`UniGetUI.PackageEngine.Interfaces`** - Contracts: `IPackageManager`, `IPackage`, `IManagerSource`, `IPackageDetails`
14+
- **`UniGetUI.PackageEngine.PackageManagerClasses`** - Base implementations: `PackageManager` (abstract), `Package`, helpers (`BasePkgDetailsHelper`, `BasePkgOperationHelper`, `BaseSourceHelper`)
15+
- **`UniGetUI.PackageEngine.Managers.*`** - Concrete manager implementations (one project per manager: `WinGet`, `Scoop`, `Chocolatey`, `Pip`, `Npm`, etc.)
16+
- **`UniGetUI.PackageEngine.Operations`** - Install/update/uninstall operation orchestration
17+
- **`UniGetUI.Interface.*`** - Enums, telemetry, background API
1818

1919
## Adding a New Package Manager
2020

@@ -27,9 +27,9 @@ protected override IReadOnlyList<Package> GetInstalledPackages_UnSafe();
2727
```
2828

2929
Each manager also provides three helper classes (in a `Helpers/` subfolder):
30-
- `*PkgDetailsHelper` extends `BasePkgDetailsHelper` ΓÇô overrides `GetDetails_UnSafe`, `GetInstallableVersions_UnSafe`, `GetIcon_UnSafe`, etc.
31-
- `*PkgOperationHelper` extends `BasePkgOperationHelper` ΓÇô overrides `_getOperationParameters`, `_getOperationResult`
32-
- `*SourceHelper` extends `BaseSourceHelper` ΓÇô overrides `GetSources_UnSafe`, `GetAddSourceParameters`, etc.
30+
- `*PkgDetailsHelper` extends `BasePkgDetailsHelper` - overrides `GetDetails_UnSafe`, `GetInstallableVersions_UnSafe`, `GetIcon_UnSafe`, etc.
31+
- `*PkgOperationHelper` extends `BasePkgOperationHelper` - overrides `_getOperationParameters`, `_getOperationResult`
32+
- `*SourceHelper` extends `BaseSourceHelper` - overrides `GetSources_UnSafe`, `GetAddSourceParameters`, etc.
3333

3434
The constructor sets `Capabilities`, `Properties`, and wires the helpers. See `src/UniGetUI.PackageEngine.Managers.Scoop/Scoop.cs` as a clean reference implementation.
3535

@@ -42,13 +42,10 @@ dotnet test --verbosity q --nologo
4242

4343
# Publish release build
4444
dotnet publish src/UniGetUI/UniGetUI.csproj /p:Configuration=Release /p:Platform=x64
45-
46-
# Full release (runs version script, tests, publish, installer)
47-
build_release.cmd
4845
```
4946

5047
- Target framework: `net8.0-windows10.0.26100.0` (min `10.0.19041`)
51-
- Build generates secrets via `src/UniGetUI/Services/generate-secrets.ps1` and integrity tree via `scripts/generate_integrity_tree.py`
48+
- Build generates secrets via `src/UniGetUI/Services/generate-secrets.ps1` and integrity tree via `scripts/generate-integrity-tree.ps1`
5249
- Self-contained, publish-trimmed (partial), Windows App SDK self-contained
5350
- Tests use **xUnit** (`[Fact]`, `Assert.*`)
5451

@@ -72,7 +69,7 @@ Use `CoreTools.Translate("text")` for all user-facing strings. Parameterized: `C
7269

7370
### Manager conventions
7471
- `FALSE_PACKAGE_NAMES`, `FALSE_PACKAGE_IDS`, `FALSE_PACKAGE_VERSIONS` static arrays filter CLI parsing noise
75-
- Manager initialization flows through `Initialize()` → `_loadManagerExecutableFile()` → `_loadManagerVersion()` → `_performExtraLoadingSteps()`
72+
- Manager initialization flows through `Initialize()` -> `_loadManagerExecutableFile()` -> `_loadManagerVersion()` -> `_performExtraLoadingSteps()`
7673
- Operations that may fail return `OperationVeredict` (note: intentional misspelling used throughout codebase)
7774

7875
## Key Files

build_release.cmd

Lines changed: 0 additions & 85 deletions
This file was deleted.

scripts/apply_versions.py

Lines changed: 0 additions & 88 deletions
This file was deleted.

0 commit comments

Comments
 (0)