🍺

Homebrew管理下のGUIもNixに移してみる nix-darwin篇

2024/08/20に公開

macOSにおけるパッケージマネージャといえばHomebrewが定番ですね。

https://brew.sh/

ところで、最近は純粋関数型パッケージマネージャのNixが流行りで激アツです。Nix関連ツールのnix-darwinを使うと、Homebrewのようなパッケージ管理ができるということを知り、やってみました。

https://nixos.wiki/wiki/Home_Manager

前回の記事で作ったファイルを書き換える形で進めていくので、先に以下の記事をご確認ください。また、Apple Silicon Mac環境での作業を基に書いています。

https://zenn.dev/kawarimidoll/articles/9c44ce8b60726f

導入

nix-darwinはNix経由でmacOSの設定をできるツールです。

https://github.com/LnL7/nix-darwin

今回はHomebrewで入れるGUIアプリをこのnix-darwinの管理下に移します。
都度brew installを実行するのではなく、設定ファイルにアプリ一覧を記述できるというのが嬉しいポイントです。

前回作ったflakeにnix-darwinを導入します。

ディレクトリ構成
.
├ flake.lock
├ flake.nix
└ nix
   ├ home-manager
   │  └ default.nix
   └ nix-darwin      # 今回追加
      └ default.nix  # 今回追加

前回の記事とはhome-managerの設定の保存先が変わっているためflake.nixを再掲します。

開始時点のflake.nix
flake.nix
{
  description = "Minimal package definition for aarch64-darwin";

  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
    neovim-nightly-overlay.url = "github:nix-community/neovim-nightly-overlay";
    vim-src = {
      url = "github:vim/vim";
      flake = false;
    };
    home-manager = {
      url = "github:nix-community/home-manager";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs = {
    self,
    nixpkgs,
    home-manager,
    ...
  } @ inputs: let
    system = "aarch64-darwin";
    username = "kawarimidoll";
    pkgs = import nixpkgs {inherit system;};
  in {
    apps.${system}.update = {
      type = "app";
      program = toString (pkgs.writeShellScript "update-script" ''
        set -e
        echo "Updating flake..."
        nix flake update
        echo "Updating home-manager..."
        nix run nixpkgs#home-manager -- switch --flake .#myHomeConfig
        echo "Update complete!"
      '');
    };

    homeConfigurations = {
      myHomeConfig = home-manager.lib.homeManagerConfiguration {
        pkgs = pkgs;
        extraSpecialArgs = {inherit inputs;};
        modules = [./nix/home-manager/default.nix];
      };
    };
  };
}

flake.nixにnix-darwinを読み込む設定を追加します。

flake.nix
{
  # ...
  inputs = {
    # ...
+   nix-darwin = {
+     url = "github:LnL7/nix-darwin";
+     inputs.nixpkgs.follows = "nixpkgs";
+   };
  };

  outputs = {
    # ...
+   nix-darwin,
    ...
  } @ inputs: let
    system = "aarch64-darwin";
    username = "kawarimidoll";
    pkgs = import nixpkgs {inherit system;};
  in {
    # ...
+   darwinConfigurations.kawarimidoll-darwin = nix-darwin.lib.darwinSystem {
+     system = system;
+     modules = [ ./nix/nix-darwin/default.nix ];
+   };
  };
}

nix-darwinの設定ファイルを追加します。
確認のため、最初はアプリの読み込み設定は行わず、簡単な設定を記述してみます。

nix/nix-darwin/default.nix
{pkgs, ...}: {

  # nix自体の設定
  nix = {
    optimise.automatic = true;
    settings = {
      experimental-features = "nix-command flakes";
      max-jobs = 8;
    };
  };
  services.nix-daemon.enable = true;

  # システムの設定(nix-darwinが効いているかのテスト)
  system = {
    defaults = {
      NSGlobalDomain.AppleShowAllExtensions = true;
      finder = {
        AppleShowAllFiles = true;
        AppleShowAllExtensions = true;
      };
      dock = {
        autohide = true;
        show-recents = false;
        orientation = "left";
      };
    };
  };
}

設定の読み込みはflake.nixに記述した名前を使用します。筆者はdarwinConfigurations.kawarimidoll-darwinとしたので、以下のコマンドになります。ここはご自分の設定した名前に書き換えてください。

nix flake update
nix run nix-darwin -- switch --flake .#kawarimidoll-darwin

さきほどのnix/nix-darwin/default.nixでは、systemの部分に以下のようなシステム設定を加えています。これらが反映されていたらnix-darwinの読み込み成功です。

  • ファイル拡張子を表示
  • 隠しファイルを表示
  • Dockを自動で隠す
  • Dockを左側に配置

既にこれらが有効になっている場合はこれだと確認にならないので、Dock位置の定義を変えるなどしてnix-darwinの読み込みで変化が起きているか確かめてください。

よさそうであれば、前述の読み込みスクリプトを一括で実行できるよう、flake.nixのappに記述を追加しておきます。

flake.nix
{
  # ...
  outputs = {
    # ...
  } @ inputs: let
    system = "aarch64-darwin";
    username = "kawarimidoll";
    pkgs = import nixpkgs {inherit system;};
  in {
    apps.${system}.update = {
      type = "app";
      program = toString (pkgs.writeShellScript "update-script" ''
        set -e
        echo "Updating flake..."
        nix flake update
        echo "Updating home-manager..."
        nix run nixpkgs#home-manager -- switch --flake .#myHomeConfig
+       echo "Updating nix-darwin..."
+       nix run nix-darwin -- switch --flake .#kawarimidoll-darwin
        echo "Update complete!"
      '');
    };
    # ...
  };
}

これでnix run .#updateでflake / home-manager / nix-darwinの更新をまとめて行うことができます。全部やると時間かかるけど。

パッケージ定義の記述

nix-darwinの設定ファイルにGUIアプリ読み込みの記述を追加します。
ここではsublime textを入れてみます。

nix/nix-darwin/default.nix
{pkgs, ...}: {
  # ...

  # homebrewの設定
  homebrew = {
    enable = true;
    onActivation = {
      autoUpdate = true;
      # !! 注意 !!
      # cleanup = "uninstall";
    };
    casks = [
      # ここにGUIアプリの記述
      "sublime-text"
    ];
  };
}

ここで一つ注意。筆者は最初に試した際、GitHubで見た設定ファイルを参考に、cleanupフラグを設定しました。
しかしこれはNix管理下にないHomebrewアプリを消す設定です。完全にNixに以降していれば問題ないと思われますが、少なくとも、試験的にアプリを登録してみようという段階では設定してはいけません。いま使っているものが吹っ飛びます。

NixでGUIアプリを導入する設定を試していたらNix管理下だけにする設定を誤って入れてしまい既存のアプリ全削除になって復旧したのが今です
Nix以前から環境を一括インストールできる仕組みを作っていたのでなんとかなったけどブラウザの履歴とか細かい設定とかが全て吹き飛んで結構ダメージ受けてます
https://bsky.app/profile/kawarimidoll.bsky.social/post/3kyng24twww2b

nix run .#updateしてsublime textを起動できれば成功です。
あとは必要なGUIアプリを追加していきましょう。

フォントも設定する

fontもnix-darwinで設定できます。名前は以下で検索します。

https://search.nixos.org/packages

nix/nix-darwin/default.nix
{pkgs, ...}: {
  # ...

  # フォントの設定
  fonts = {
    packages = with pkgs; [
      hackgen-nf-font
    ];
  };
}

Font Bookアプリから検索すると、Nix Fontsの中に保存されているのが確認できます。

参考

nix-darwinの公式マニュアルです。

https://daiderd.com/nix-darwin/manual/index.html

主に参考にした設定ファイルです。

https://github.com/takeokunn/nixos-configuration

Discussion