Skip to main content

Remove nh And Clarify Darwin GC Owner

2 min read

TLDR

TLDR

这次处理的目标很小,核心是把 nh 从当前工作流里下线,并把 Darwin 侧的 GC 责任边界说清楚。

问题核心还是出自于 darwin 上(用nh配置)的GC一直没生效

之所以用nh,就是之前希望可以把 darwin和nixos的相关操作,都收束到 nh,但是现在看来没什么必要。NixOS上最好用的方案,肯定是 nixos-cli 了。而 darwin上,我使用的 Determinate-Nix 本身也提供了全套的更适用于 darwin 的方案。所以最终决定移除掉 nh,都选择各自的原生方案。

结论

  • 已移除 nh 的 Home Manager 配置。
  • 已移除 Darwin 上依赖 nh clean alllaunchd task。
  • NixOS 侧恢复使用原生 nix.gc
  • Darwin 侧显式声明由 Determinate Nixd 负责 automatic GC,而不是继续依赖 nh 或手搓 launchd

原因

  • 对当前仓库来说,nh 已经没有不可替代职责。
  • 之前的 Darwin nh-clean-all 实际上已经失效,导致“看起来配了 GC,实际上没正常跑”。
  • 当前 Darwin 本来就由 Determinate Nix 接管 Nix daemon,因此 GC 也应由同一个 owner 负责,避免多套机制并存。

备注

  • 这次不追求扩展能力,只做职责收敛和行为显式化。
  • 后续如果排查 Darwin 垃圾回收,优先看 Determinate Nixd 的配置与日志,不再看 nh

给 Determinate Nixd 补充 Auto prune generations能力 [2026-04-07]

  • why this config: determinateNixd.garbageCollector.strategy = "automatic" 只明确了 Darwin 侧的 GC owner 是 Determinate Nixd,但没有覆盖按时间裁剪旧 system generations 的保留策略。因此额外补一条 host 级 launchd,定时执行 nix-collect-garbage --delete-older-than 7d
  • why put it in darwin hosts: 这属于 macos-ws 的主机级运维策略,不是所有 Darwin 机器都必须共享的基础能力。先放在 host 层更符合当前仓库“按 host 决定是否启用”的约定,后续如果多台 Darwin 机器都需要,再抽成通用模块。