大概是比 Homebrew 更好用的包办理方案

为什么不必 Brew

目前在 macOS 上的干流包办理方案仍是 Homebrew,可是这玩意我觉得是一点都不好用:

  1. 真的很慢:装置新包一般来说是比较低频的操作,可是 brew 会自作主张给你在装置前检查自己的更新;就算越过这一步,和其他包办理器相比,从头装置一个包所需求的时间差异也十分大,我是不太能了解这么一件简略的事儿为什么 brew 需求花那么久;
  2. “污染”体系文件:众所周知,brew 会把东西全部一股脑的装到 /usr/local/bin 中,假如有一些包想作恶会很轻松的混入体系默认 PATH 中,brew 社区运作的模式也无法确保一切包都是安全的,何况还有可能遇到供应链攻击;
  3. 晦涩难明:Homebrew 用了大量的啤酒出产术语:Formula, Keg, Tap, Cellar, Bottle, Cask, …关于我这种滴酒不沾的人来说了解门槛确实有点高,得去好好学习一下才知道这些都是啥。

总之 Brew 并不是一个让我用着舒服的包办理器。可是迫于生计需求在 macOS 上搬砖来养活自己,不能说走就走跑去用 Linux 写代码,所以我就把目光转向了 Nix。

Nix 和 NixOS

大概一年前我在苦于无法快捷地办理 10 台服务器时发现了 NixOS,有很多文章都具体介绍了 NixOS 的特色,让我心动不已:

  1. /etc/nixos 为中心,经过装备文件来操控整个体系上装置的软件和他们的装备;
  2. 可重复构建,关于相同的装备文件,构建出来的操作体系也是共同的*;
  3. NixOS 运用的包办理器的装备语言 Nix 图灵齐备,装备妥当我能够在一个 git 仓库中维护我一切服务器的装备,能够最大化同享基础装备,一起记录一切历史版别便利回滚和调试。
  4. Nix 是函数式的!十分有意思不是吗

* 当然和大部份包办理器相同,假如没有锁其实也并不能确保这一点

在后来的一段时间里我逐渐用 NixOS 替换了我大部分服务器上的 Debian。期间我注意到 NixOS 的下载页面中,Nix (the package manager) 是有 macOS 版别的:

在 macOS 中运用 Nix 作为包办理器

所以就方案好了,之后必定要把 brew 从我的体系中彻底抹掉。

替换关键

公司有一个政策:购入三年的 MacBook 产品能够请求到期替换,假如想要乃至能够挑选将这台打工电脑回购。满三年之后我自然是立即和 IT 发起了到期替换流程,这台 Intel MacBook Pro 虽然装备了 i7 32G,可是用起来依然是卡到爆破,写代码随时处在崩溃边缘 _(:」∠)_

请求当天 IT 就通知我能够来领电脑了。换来的新电脑仍是 16 英寸的 MacBook,装备了 M2 处理器和 32G 的内存,全体上十分符合我的期待。至于软件,我不打算从旧的 Intel Mac 上搬迁数据,究竟跨了架构,总感觉会不靠谱。所以这次我就没有装置 brew,预备小试一下不在 NixOS 中运用 Nix。

装置 Nix

就和上面官网截图中介绍的相同,Nix 的装置也是直接用 curl 下载脚本执行来完结的。

sh <(curl -L https://nixos.org/nix/install)

不过和大部份”一键脚本”还不太相同,Nix 会在装置过程中具体的输出了自己需求干什么,特别是用到 sudo 的时分:

在 macOS 中运用 Nix 作为包办理器

装置完结之后,我们就能够在终端运用 nix 命令了:

在 macOS 中运用 Nix 作为包办理器

nix 和 brew 比起来有一个很好的地方,就是他的装置的文件都是放在一个 APFS 容器中,假如想要删除 Nix 很便利:删掉容器就好了。

到此为止我们就现已装置完结了 nix 这个包办理器,可是间隔像 NixOS 相同用一个 configuration.nix 办理大部份软件还有点区别。

装置 nix-darwin

nix-darwin 把 NixOS 的软件办理模式复刻到了 macOS 上,我们能够用 nix 很便利的装置 nix-darwin:

nix-build https://github.com/LnL7/nix-darwin/archive/master.tar.gz -A installer
./result/bin/darwin-installer

装置完结之后,我们就能够在 ~/.nixpkgs 中发现这个 darwin-configuration.nix 了:

{ config, pkgs, ... }:
{
  environment.systemPackages = [
    pkgs.vim
  ];
  services.nix-daemon.enable = true;
  programs.zsh.enable = true;  # default shell on catalina
  system.stateVersion = 4;
}

由于我是一个臭写 HTML 的,所以需求装置 node,一起我更习惯运用 GNU 的 coreutils 而不是 BSD 的,所以我将这个装备调整至如下:

{ config, pkgs, lib, ... }:
{
  nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
    "unrar"
  ];
  environment.systemPackages = with pkgs; [
    vim ffmpeg-full coreutils gnugrep gnused gawk htop mtr
    smartmontools neofetch rsync p7zip hugo ncdu
    ipmitool iperf3 wireguard-tools jq p7zip unrar
  ];
  services.nix-daemon.enable = true;
  programs.zsh.enable = true;
  system.stateVersion = 4;
}

之后只需求执行 darwin-rebuild switch 即可让 darwin-nix 完结软件的装置和装备(我这里出于运用习惯,没有运用装备的能力)。完结之后一切的软件就都在 PATH 中了:

在 macOS 中运用 Nix 作为包办理器

看日志不难注意到 /Applications/Nix Apps 这个目录的存在,实际上不只是命令行软件,GUI 软件也能够经过 Nix 装置,比方这个叫 kitty 的终端模拟器

在 macOS 中运用 Nix 作为包办理器