macOS x Nix - 使用 Nix 管理 macOS

论坛里偶尔有人讨论 NixOS 和 Guix,我也来分享下自己的配置 :wink:

上面的配置使用了 Nix 生态下的一些工具来管理:

  • macOS 系统配置(由 nix-darwin 支持)
  • 软件包(由 nix / nix-darwin / homebrew 共同支持)
  • dotfiles(由 home-manager 支持) - 包括 Bash / Emacs / Tmux 等软件的配置
  • virtual machine 镜像的构建(由 nixos-generators 支持)
  • virtual machine 的部署(由 morph 支持)
  • ……

个人觉得 Nix 最棒的是对 reproducible ,只要配置内容不变,总可以得到相同的构建结果。换电脑变得很简单 —— 拷贝一个目录,重新构建上面的配置就够了。


Emacs 体验

我也用它来管理 Emacs 构建和配置:

  • emacs-overlay 用来锁定 package 版本
  • 使用 *.org 文件来做文学化的配置

传送门:https://github.com/c4710n/macos-x-nix/tree/master/modules/emacs


其他开发体验

另外,还可以用 nix 提供的工具 nix-shell 来管理开发环境。比如下面就声明了一个 Elixir 项目的运行环境:

{ pkgs ? import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/856672f2ce37f47b69c31c448fb6e30f39761e66.tar.gz") { } }:

with pkgs;

mkShell {
  buildInputs = [
    beam.packages.erlangR24.elixir_1_13
    nodePackages.npm
  ]
  ++ lib.optionals stdenv.isLinux [
    # For ExUnit Notifier on Linux.
    libnotify

    # For file_system on Linux.
    inotify-tools
  ]
  ++ lib.optionals stdenv.isDarwin ([
    # For ExUnit Notifier on macOS.
    terminal-notifier

    # For file_system on macOS.
    darwin.apple_sdk.frameworks.CoreFoundation
    darwin.apple_sdk.frameworks.CoreServices
  ]);

配合上 direnv 之类的工具,nix-shell 可以自动启动,开发的时候用很方便。


希望可以激起大家对 Nix 兴趣~

5 个赞

折腾过一点 nix 最终没有使用下去,主要是

  1. nix 安装的某些 cli tool 在 emacs 中获取不到例如 aspell
  2. 其实并不会频繁换电脑,而且还要学习一门新的语言,就我目前个人的配置 shell 完全能 hold 住 mac 和 linux 的 bootstrap
  3. nix 最新的是不是在 mac 上只能多用户安装?
  1. 一直都用多用户模式安装,不太清楚这个。

在 macOS 上只能安装多用户模式,使用代理是个头疼的问题。另外,使用 Nix 得做好准备花费大量的时候来管理 nix 配置和处理兼容问题。

用了3个月,最后滚回了Brew, Emacs 配置通过 git submodule 来锁版本(通过borg实现半手动)

代理:

  • 可以靠 Surge 或 ClashX 的全局代理
  • 也可以在安装 nix-darwin 后,在 /etc/bash.local 声明 HTTP_PROXY 相关的变量(但这之前还是得有个全局代理

多谢,暂时不折腾 Nix 了,等再成熟一些再考虑使用。

我现在同时使用 brew 和 nix,不过我没有使用 nix 管理配置文件。nix-darwin 在更新后会挂掉吗?如何处理呢?