SuperAPI AI 工具集

nix-darwin

部署与运维

查看项目

更新于 10-16 08:23

技能介绍

nix-darwin 是一套面向 macOS 的 dotfiles 配置方案,使用 Nix flakes 与 home-manager 管理 macOS 系统与用户环境。

架构

整体为三层系统:darwin 模块(系统层)→ home-manager(用户层)→ homebrew(GUI 应用层)。

flake.nix 作为轻量编排层,下辖两个主机:

  • hosts/workstation/:使用 unstable 包与完整工具链。default.nix 指向 modules/darwin/;home.nix 指向 modules/home-manager/base.nix 加各程序模块;homebrew.nix 指向 modules/homebrew/base.nix 加主机 casks。
  • hosts/homelab/:使用 stable 包(macOS 13),配置最小化。default.nix 指向 modules/darwin/;darwin.nix 存放主机特定覆盖(mkForce);home.nix 指向 modules/home-manager/base.nix 加 neovim-stable;homebrew.nix 同理。

完整的依赖流与模块分层见 references/architecture.md。

核心约定

程序开关模式

每个程序模块遵循统一结构(见 templates/program-module.nix):

options.my.{program}.enable = mkEnableOption "description";
config = mkIf cfg.enable { /* config */ };

在主机 home.nix 中启用:

my.neovim.enable = true;

新增程序步骤

  1. 使用模板创建 modules/home-manager/programs/{name}.nix
  2. 在主机 home.nix 中导入
  3. 设置 my.{name}.enable = true
  4. 如需 GUI cask,加入 hosts/{host}/homebrew.nix

配置管理方式

方式 使用场景 示例
mkOutOfStoreSymlink 无需重建即可变更的配置 nvim、hyprspace
builtins.readFile 载入 nix store 的配置 zed-editor
内联 nix 简单、nix 原生配置 ghostty、starship

命名约定

  • Nix 文件:kebab-case.nix
  • 模块选项:my.{program}.enable
  • Dotfile 符号链接:symlink/ 下的 {name}.symlink
  • 主机:kebab-case
  • 提交:conventional(feat(neovim):、fix(darwin):)

常用命令

完整列表见 references/commands.md。

# 应用配置
sudo nix run nix-darwin/master#darwin-rebuild -- switch --flake .#workstation
sudo nix run nix-darwin/master#darwin-rebuild -- switch --flake .#homelab

# 仅校验不应用
nix flake check

# 更新 inputs
nix flake update

注意事项

详细说明与修复见 references/gotchas.md。

构建与系统:

  • nix.daemonProcessType = "Background" 可避免构建期间 UI 卡顿
  • Determinate Nix 与 nix-darwin 的 nix 管理冲突,需禁用其一
  • follows 未正确设置会导致闭包体积膨胀

macOS 兼容性:

  • homelab(macOS 13)需要 pkgs-stable,不要在该主机使用 unstable 包
  • PAM 服务可能需要 lib.mkForce {} 覆盖 darwin 默认值

包管理:

  • Neovim 的 tree-sitter CLI 必须在 extraPackages 中显式声明(不会自动包含)
  • Homebrew cleanup 可能移除 nix 管理的包,需禁用 autoCleanup
  • Homebrew cask 与 nixpkgs 取舍:CLI 工具优先 nixpkgs,GUI 应用优先 homebrew

Nix 模式:

  • mkForce 与 mkDefault:mkForce 优先级最高,谨慎使用
  • mkOutOfStoreSymlink 路径必须是绝对字符串,不能是 nix path

社区模式

当用户询问改进或替代方案时,可参考 references/community-patterns.md。高星仓库中的关键模式包括:

  • mkDarwinConfig 辅助函数:减少 flake.nix 样板(malob、kclejeune)
  • 多通道 overlay:任意位置使用 pkgs.stable.X 对比 specialArgs(malob)
  • 自动导入模块:目录扫描消除手动导入列表(wimpysworld)
  • 基于标签的特性:声明主机“是什么”而非“有什么”(wimpysworld)
  • primaryUser 别名:写 hm.programs.X 而非完整路径(kclejeune)
  • flake 中的 treefmt:deadnix + nixfmt + statix(kclejeune)
  • 自动化 flake lock 更新:CI 自动 PR 加自动合并(wimpysworld)