返回 Skill 列表
extension
分类: 开发与工程无需 API Key

nix-system-config

适用于macOS (nix-darwin)、NixOS和Home Manager系统的Nix flake配置。在执行以下任务时使用:(1) 构建或应用系统配置,(2) 添加/修改软件包或程序,(3) 创建或编辑Nix模块,(4) 通过home-manager管理点文件,(5) 配置darwin服务/代理,(6) 使用homebrew casks/brews,(7) 涉及此仓库中.nix文件的任何任务。

person作者: jakexiaohubgithub

Nix System Config

Multi-platform Nix flake managing macOS, NixOS, and Home Manager configurations.

Hosts

| Host | Platform | Apply Command | |----------------|-----------------|---------------| | m4-mbp | macOS (darwin) | nix-rebuild or darwin-rebuild switch --impure --flake . | | macos-virtual | macOS (darwin) | darwin-rebuild switch --impure --flake . | | drummer | NixOS | sudo nixos-rebuild switch --impure --flake .# | | xcel | Debian (HM) | home-manager switch -b backup --flake .#"john.allen@xcel" --impure | | pi-01 | Debian/Pi (HM) | home-manager switch -b backup --flake .#"john.allen@pi-01" |

Commands

# Build without applying
nix build .#darwinConfigurations.m4-mbp.system
nix build .#homeConfigurations."john.allen@pi-01"

# Apply (macOS - fish shell alias)
nix-rebuild                    # updates flake first
nix-rebuild --switch-only      # skip flake update

# Apply (macOS - manual)
set -xg NIXPKGS_ALLOW_UNFREE 1; darwin-rebuild switch --impure --flake .

# Test single option
nix eval .#darwinConfigurations.m4-mbp.config.services.sketchybar.enable

# Update inputs
nix flake update --commit-lock-file

# Lint
nix flake check

Directory Structure

hosts/           # Per-host configs (kebab-case names)
lib/             # Helper functions (make-*-system.nix)
modules/
  common/        # Shared across platforms
  darwin/        # macOS-specific (agents, homebrew, system)
  home-manager/  # User programs/dotfiles
  nixos/         # NixOS-specific

Code Style

  • 2-space indentation, no tabs
  • Trailing commas consistently
  • Use flake inputs (nixpkgs, home-manager); avoid import <nixpkgs>
  • Attr ordering: imports first, then logical groups (services, programs, environment)
  • Host names: kebab-case; variables: snake_case
  • Prefer mkIf for conditions; avoid nested if chains
  • Minimize assert; use lib.warn/lib.trace for diagnostics
  • Match option schemas; explicit lists; no string concat for paths
  • Never commit secrets; use keychain or environment variables

Adding a Package

Home Manager program (user-level):

# modules/home-manager/default.nix or relevant submodule
programs.<name>.enable = true;
# or
home.packages = with pkgs; [ package-name ];

Darwin system package:

# modules/darwin/environment/default.nix
environment.systemPackages = with pkgs; [ package-name ];

Homebrew (macOS GUI apps):

# modules/darwin/homebrew/default.nix
homebrew.casks = [ "app-name" ];
homebrew.brews = [ "formula-name" ];

Creating a Module

  1. Create modules/<platform>/<name>/default.nix
  2. Add to imports in parent default.nix
  3. Use mkIf for conditional logic:
{ config, lib, pkgs, ... }:
{
  options.my.feature.enable = lib.mkEnableOption "my feature";
  
  config = lib.mkIf config.my.feature.enable {
    # configuration here
  };
}

Policy

Never create git commits unless explicitly requested.