mirror of
https://github.com/nix-community/home-manager.git
synced 2026-06-05 21:02:51 +00:00
Adds `home.services`, an attribute set of nixpkgs [modular services](https://nixos.org/manual/nixos/unstable/#modular-services) sourced from `<nixpkgs/lib/services/lib.nix>`. Each service exposes `process.argv` and the upstream NixOS-style systemd schema (`systemd.lib`, `systemd.mainExecStart`, `systemd.service`, `systemd.services`, `systemd.sockets`) by re-exporting `nixos/modules/system/service/systemd/service.nix`. Service modules shipped with `_class = "service"` (e.g. `pkgs.<name>.passthru.services.default`) drop in unchanged -- service portability across module systems is the point of modular services. Lifted units are evaluated and translated from NixOS-style attrs (`wantedBy`, `serviceConfig`, `unitConfig`, `environment`, ...) into the section-based INI shape (`{ Unit; Service; Install; }`) that home-manager's `systemd.user.{services,sockets}` consumes; only the common keys are mapped, uncommon options remain reachable via `unitConfig` / `serviceConfig` / `socketConfig`. Sub-services and their units are dashed under the parent service name; `process.argv` becomes the default `ExecStart` for the service's primary unit, which defaults to `WantedBy=default.target`. Mirrors the surface of nixpkgs' portable systemd module (services + sockets only); other unit kinds home-manager supports natively (timers etc.) are intentionally not modeled until upstream grows them. Each service's `configData.<name>` entries are materialized at `$XDG_CONFIG_HOME/system-services/<service-prefix>/<name>` (mirroring how `nixos/modules/system/service/systemd/{config-data-path,system}.nix` lifts `configData` to `environment.etc`), with the absolute path injected back into `configData.<name>.path` so the service can refer to its files at a stable location. Includes nmt tests covering: a basic `process.argv`-only service, a service with a `configData` entry, and importing `pkgs.ghostunnel.passthru.services.default` to assert the lifted user unit contains the expected ExecStart flags and `LoadCredential` entries.
43 lines
1.1 KiB
Nix
43 lines
1.1 KiB
Nix
# Sets `path` on each modular service's `configData.<name>` so that the
|
|
# service can refer to its config files at a stable absolute location
|
|
# inside the user's XDG config directory. Mirrors
|
|
# `nixos/modules/system/service/systemd/config-data-path.nix`.
|
|
let
|
|
setPathsModule =
|
|
prefix:
|
|
{
|
|
lib,
|
|
name,
|
|
xdgConfigHome,
|
|
...
|
|
}:
|
|
let
|
|
inherit (lib) mkOption types;
|
|
servicePrefix = "${prefix}${name}";
|
|
in
|
|
{
|
|
_class = "service";
|
|
options = {
|
|
configData = mkOption {
|
|
type = types.lazyAttrsOf (
|
|
types.submodule (
|
|
{ config, ... }:
|
|
{
|
|
config.path = lib.mkDefault "${xdgConfigHome}/system-services/${servicePrefix}/${config.name}";
|
|
}
|
|
)
|
|
);
|
|
};
|
|
services = mkOption {
|
|
type = types.attrsOf (
|
|
types.submoduleWith {
|
|
modules = [ (setPathsModule "${servicePrefix}-") ];
|
|
specialArgs = { inherit xdgConfigHome; };
|
|
}
|
|
);
|
|
};
|
|
};
|
|
};
|
|
in
|
|
setPathsModule ""
|