デンシナブログ!!!

Nixを使ってみた感想!

ちょろっと前からNixOSを使ってて、なかなかいい感じだから感想を述べます!たいして理解してないから間違ってたりするかもだけど、許して〜。

Nixとは

Nixは多分言語の名前で、NixOSがLinux distroの名前っぽい。

特徴

  • Nixで設定ファイルを宣言的に書いて、それを使ってOSのパッケージを定義したり、OSを設定したりできるよ!

  • さらにFlakeっていうNixOSの機能を解禁すると、依存関係をなんかいい感じにやってくれるよ!

npmとかのpackage-lock.jsonみたいな感じだね。まだexperimentalな機能なんだけど、めっちゃ便利だから基本的にはみんな使ってるっぽい。

長所だと思うところ!

  • パッケージ入れるのが簡単!

  • パッケージ同士の依存関係で(あんまり?)困らない!

  • package.jsonみたいに、gitで管理するから、色々試しても簡単に元に戻せる!

  • gitなしでもビルドを保存してる機能があるから、めっちゃぶっ壊れてgit操作すらできなくなっても簡単に元に戻せる!

  • 仮想環境を簡単に用意できる。つまり、globalにinstallせずに、特定のdirだけで有効な環境をつくったりできる!(特定のdirだけにHaskellの実行環境を用意したりできる)

短所だと思うところ!

  • Nixの書き方がよくわかんない(ネット上のサンプル+chatgptでモゾモゾ...)

  • packageのuninstallって概念はなくて、めっちゃ容量くう。今見たら233GB使ってた。(使ってないパッケージは一定時間経過したらGCが勝手に消すらしい?コマンドで消すこともできる)

  • nix packageとして公開されてないやつを入れるのが大変っぽい...(FHSにも当然準拠してない。でも大体packageあるから困ったことはあんまりない)

My Nix Config

僕のnixosのflake.nixはこんな感じ。

{
  description = "my flake";
  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
    utils.url = "github:numtide/flake-utils";
  };

  outputs = { self, nixpkgs, utils, home-manager }: {
    nixosConfigurations.nixos = nixpkgs.lib.nixosSystem {
      system = "x86_64-linux";
      modules = [
        ./configuration.nix
        ({ config, pkgs, ... }: {
          environment.systemPackages = with pkgs; [
            tree
            zip
            unzip
            vim
            git
            vscode
            // 省略 //
          ];

          // 省略 //

          # 日本語設定関係
          i18n.inputMethod = {
            type = "fcitx5";
            enable = true;
            fcitx5.addons = [ pkgs.fcitx5-mozc ];
          };
          fonts = {
            packages = with pkgs; [
              noto-fonts-cjk-serif
              noto-fonts-cjk-sans
              noto-fonts-emoji
              nerdfonts
            ];
            fontDir.enable = true;
            fontconfig = {
              defaultFonts = {
                serif = [ "Noto Serif CJK JP" "Noto Color Emoji" ];
                sansSerif = [ "Noto Sans CJK JP" "Noto Color Emoji" ];
                monospace = [ "JetBrainsMono Nerd Font" "Noto Color Emoji" ];
                emoji = [ "Noto Color Emoji" ];
              };
            };
          };
          swapDevices = [{
            device = "/swapfile";
            size = 16 * 1024;
          }];
        })
      ];
    };
  };
}

こんなふうにinputとoutputを定義してつらつら書くだけで環境構築が完了するよ! `environment.systemPackages = with pkgs; [`みたいにかいてあるところの下にずら〜っと使いたいパッケージを列挙したり、その下のi18nうんぬんのあたり以下みたいな文章を書くだけで、パッケージの設定とかOSの設定ができるよ。 めっちゃ簡単!

まとめ

NixOSいいぞ〜。みんなも使おう!