Three separate reasons the packaged build didn't behave like the one Rider launches: - dotnet-runtime must be aspnetcore_10_0, not runtime_10_0. Tome.App's runtimeconfig.json requires Microsoft.AspNetCore.App as well as Microsoft.NETCore.App, because Photino hosts a local Kestrel server, and only the aspnetcore bundle ships it. - wrapGAppsHook3, so gappsWrapperArgs get spliced into buildDotnetModule's own wrap step (it sets dontWrapGApps itself; same pattern as nixpkgs' libation). Without it nothing sets XDG_DATA_DIRS/GSETTINGS_SCHEMA_DIR, so GTK/WebKitGTK found neither the icon theme nor GTK settings — missing icons and a denser default font than in an already-initialized session. - glib in runtimeDeps. It doesn't arrive via gtk3/webkitgtk's RPATH because the consumer is Photino.Native.so, a prebuilt binary out of the nuget package rather than something Nix built and patched. tome-deps.json is the regenerated nuget lock for the aspnetcore switch. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
99 lines
3.1 KiB
Nix
99 lines
3.1 KiB
Nix
{ lib
|
|
, buildDotnetModule
|
|
, buildNpmPackage
|
|
, importNpmLock
|
|
, dotnetCorePackages
|
|
, glib
|
|
, gtk3
|
|
, webkitgtk_4_1
|
|
, libnotify
|
|
, makeDesktopItem
|
|
, copyDesktopItems
|
|
, wrapGAppsHook3
|
|
, src
|
|
}:
|
|
|
|
# Tome (née AudibleLibrary) — darman's own Photino/.NET desktop app for
|
|
# converting/managing an Audible library. Private repo on our own gitea;
|
|
# `src` is threaded in by the caller from the `tome` flake input rather than
|
|
# fetched here, so this file has no credentials or URL baked in.
|
|
#
|
|
# Two-stage build: the Preact/Vite frontend (Tome.App/ClientApp) is built as
|
|
# its own npm derivation, then copied into the published app's wwwroot.
|
|
# Upstream normally does this via an in-project MSBuild <Exec> npm target,
|
|
# which has no network access in the Nix sandbox — skipped here
|
|
# (-p:SkipNpmBuild=true) in favor of doing it as a proper Nix derivation.
|
|
let
|
|
frontend = buildNpmPackage {
|
|
pname = "tome-frontend";
|
|
version = "0.0.0";
|
|
src = "${src}/Tome.App/ClientApp";
|
|
npmDeps = importNpmLock { npmRoot = "${src}/Tome.App/ClientApp"; };
|
|
npmConfigHook = importNpmLock.npmConfigHook;
|
|
installPhase = ''
|
|
runHook preInstall
|
|
cp -r dist $out
|
|
runHook postInstall
|
|
'';
|
|
};
|
|
in
|
|
buildDotnetModule (finalAttrs: {
|
|
pname = "tome";
|
|
version = "0-unstable";
|
|
|
|
inherit src;
|
|
|
|
projectFile = "Tome.App/Tome.App.csproj";
|
|
nugetDeps = ./tome-deps.json;
|
|
|
|
dotnet-sdk = dotnetCorePackages.sdk_10_0;
|
|
# aspnetcore_10_0, not runtime_10_0: Tome.App's runtimeconfig.json requires
|
|
# both Microsoft.NETCore.App AND Microsoft.AspNetCore.App (Photino hosts a
|
|
# local Kestrel server), and only the aspnetcore bundle ships the latter.
|
|
dotnet-runtime = dotnetCorePackages.aspnetcore_10_0;
|
|
|
|
dotnetFlags = [ "-p:SkipNpmBuild=true" ];
|
|
|
|
executables = [ "Tome.App" ];
|
|
|
|
# wrapGAppsHook3: buildDotnetModule sets dontWrapGApps = true by default (to
|
|
# avoid double-wrapping) but its own wrap step still splices gappsWrapperArgs
|
|
# in when the hook is present (see nixpkgs' libation package, same pattern).
|
|
# Without it the binary never gets XDG_DATA_DIRS/GSETTINGS_SCHEMA_DIR set, so
|
|
# GTK/WebKitGTK can't find the icon theme or GTK settings from the desktop
|
|
# session — symptoms: missing icons and a denser default UI font/size than
|
|
# when launched from an already-fully-initialized session (e.g. via Rider).
|
|
nativeBuildInputs = [ copyDesktopItems wrapGAppsHook3 ];
|
|
|
|
runtimeDeps = [
|
|
# glib: not pulled in via gtk3/webkitgtk's own RPATH here, because the
|
|
# thing that needs it — Photino.Native.so — is a prebuilt binary shipped
|
|
# in the Photino.Native nuget package, not something Nix built/patched.
|
|
glib
|
|
gtk3
|
|
webkitgtk_4_1
|
|
libnotify
|
|
];
|
|
|
|
postInstall = ''
|
|
cp -r ${frontend} $out/lib/${finalAttrs.pname}/wwwroot
|
|
'';
|
|
|
|
desktopItems = [
|
|
(makeDesktopItem {
|
|
name = "tome";
|
|
exec = "Tome.App";
|
|
desktopName = "Tome";
|
|
comment = "Audible library manager";
|
|
categories = [ "AudioVideo" ];
|
|
})
|
|
];
|
|
|
|
meta = {
|
|
description = "Audible library manager (Photino/.NET desktop app)";
|
|
homepage = "https://git.mgaction.town/darman/TOME";
|
|
platforms = [ "x86_64-linux" ];
|
|
mainProgram = "Tome.App";
|
|
};
|
|
})
|