me-web? skeleton: Avalonia 12 app, server, packaging and CI
Build / Desktop, server and tools (push) Successful in 1m7s
Build / Desktop, server and tools (push) Successful in 1m7s
The first screen (online or not, a Check button, every language with a draft notice), the desktop and Android heads, the server's /api/info and /api/ip, a release tool that builds deb, rpm, a Windows exe, macOS zips, a signed APK and the server, and the Gitea workflows that run it. Rules adapted from passolo; AGPL-3.0. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012CzABvBkbcFqoHdmi8b9WB
This commit is contained in:
commit
7589121846
76 files changed
+3082
No files matched your search
@@ -0,0 +1,49 @@
|
||||
# CLAUDE.md — MeWeb quick reference
|
||||
|
||||
Read `AGENT.md` first and cite `PATTERNS.md` for code rules. This file holds commands, the map and the pitfalls.
|
||||
|
||||
## Commands
|
||||
|
||||
```bash
|
||||
dotnet build src/MeWeb.Desktop/MeWeb.Desktop.csproj
|
||||
dotnet run --project src/MeWeb.Desktop
|
||||
dotnet run --project src/MeWeb.Server # ASPNETCORE_URLS=http://127.0.0.1:5481
|
||||
dotnet run tools/setup.cs -- --group jdk # pinned JDK 21 into tools/jdk
|
||||
dotnet run tools/setup.cs -- --group packaging # pinned nfpm into tools/packaging
|
||||
dotnet build src/MeWeb.Android/MeWeb.Android.csproj \
|
||||
-p:JavaSdkDirectory=$PWD/tools/jdk/linux-x64/jdk-21.0.12+8 -p:AndroidSdkDirectory=$HOME/Android/Sdk
|
||||
dotnet run --project tools/Screenshots -- dist/screenshots [en,it,...]
|
||||
dotnet publish src/MeWeb.Desktop -c Release -r win-x64 --self-contained -p:PublishSingleFile=true \
|
||||
-p:IncludeNativeLibrariesForSelfExtract=true -p:EnableCompressionInSingleFile=true
|
||||
dotnet publish src/MeWeb.Desktop -c Release -r osx-arm64 --self-contained
|
||||
```
|
||||
|
||||
The Android workload installs into the user SDK (`dotnet workload install android`); the system SDK in `/opt/dotnet`
|
||||
is root-owned, so CI uses the runner user's own `~/.dotnet` (passolo's `tools/release.sh` pattern).
|
||||
|
||||
## Map
|
||||
|
||||
| Path | What |
|
||||
|---|---|
|
||||
| `src/MeWeb.Shared` | `Endpoints.cs` (routes and hosts), wire contracts, `MeWebJsonContext`, generated `BuildInfo` |
|
||||
| `src/MeWeb.App` | Avalonia views and view models, `Services/Localizer.cs` (+ `{s:Tr Key}`), `Strings/*.resx`, `Resources/Colors.axaml` |
|
||||
| `src/MeWeb.Desktop` | desktop head (`meweb` executable), Windows manifest |
|
||||
| `src/MeWeb.Android` | Android head (`software.arasaka.meweb`), resources, manifest |
|
||||
| `src/MeWeb.Server` | `meweb.arasaka.software`: `/api/info`, `/api/ip` |
|
||||
| `data/languages.json` | every language with `reviewed` or `draft` |
|
||||
| `tools/setup.cs` + `setup.json` | pinned build tools |
|
||||
| `tools/Screenshots` | headless renders of every view in every language |
|
||||
| `branding/` | the icon (SVG source, PNG, ICO) |
|
||||
|
||||
## Pitfalls
|
||||
|
||||
- **Avalonia 12 Android head:** `[Application] MainApplication : AvaloniaAndroidApplication<App>` plus a non-generic
|
||||
`AvaloniaMainActivity`; the main view comes through `IActivityApplicationLifetime.MainViewFactory`, checked before
|
||||
`ISingleViewApplicationLifetime`.
|
||||
- **`ApplicationVersion` must be an integer**: computed from `Version` through separate `VersionMajor/Minor/Patch`
|
||||
properties; one nested property function left it unevaluated (`XA0003`).
|
||||
- **A headless Avalonia session does not end on its own** while the pulse animation runs: the screenshot tool calls
|
||||
`Environment.Exit(0)` after dispatching.
|
||||
- **The macOS apphost is ad-hoc signed by the .NET 10 SDK even on Linux** (`LC_CODE_SIGNATURE` present); Apple
|
||||
Silicon refuses unsigned arm64 code, so never strip it.
|
||||
- **The Windows single-file publish drops native `.pdb` files beside the exe**; only `meweb.exe` ships.
|
||||
Reference in new issue
Block a user