Nixノスゝメ

目次

Nixはいいぞ(クソデカボイス)

...はい。開幕早々この世の真理を叫んでますがそれは置いといて。

Nix。みなさん知ってます?多分全然みんな知らないんじゃないかな、多分。
だってLinuxデスクトップというくくりですらシェア3%なのに、蓋を開けてみればUbuntu・Debian・Fedora・Arch Linux辺りがシェア食い尽くしてるし。
何より、先駆者様いなけりゃ私だって知らなかったし。

ところがどっこい、その先駆者様が2024-04-01にNix入門なんて本を出したが最後、私は見事にこのNixとか言う底なし沼に容赦なく引きずり込まれたわけで、
そんな人間が、今度は引きずり込む側として読者たるあなた方を容赦なくNix沼に引きずり込もうとする、そんな記事になるはず。多分。

...冒頭からいきなり怪文書とか大丈夫かこれ。

Nixてなんやねん

Nixってのは公式マニュアル曰く純粋関数型パッケージマネージャらしいです。
...ほとんどの人は「何言ってんだ?コイツ」だと思うので軽く説明を。

純粋関数型ってめっちゃ堅そうに言ってるけど、要は情報与えたら答えを返すような存在で、特に答えを返すまでに周りに余計なことをしない、そんなヤツのこと。
同じ値を突っ込めば同じ答えが返ってくるし、返ってきた値を別のヤツに突っ込むこともできる。

例えば、「1 + x」は立派な純粋関数だけどG○ogle先生に何か聞くのは同じ検索文字列でも違う結果になることがあるので純粋関数とは言えない。

...しれっと数学の関数を出したけど「純粋関数」はあくまでプログラミング界隈の「関数」がガバガバ過ぎて生まれた、
「1対1の関係を持つ数」という厳密な意味での「関数」を表すための語に過ぎないので数学の関数であれば基本純粋関数。

で、その「1対1の関係を持つ」というのがミソで、つまり同じ設定ファイルを突っ込んでいれば同じ環境が出来上がる、
などと言う夢のようなことが実現できるぜ、と大々的に売り出してるわけだね。

閑話休題。実践に移るよ〜

インスコ方法

なんか色々あるらしいですが無難に公式サイトからやるのが一番じゃないですかね。

上の方はNixのダウンロードたちが、下の方はこのNixでシステム全部管理しようとか言う極左OSであるNixOSのインストーラーISOのダウンロードたちがいるので(NixOSはいいぞ(小声))
上の方を探して自分の環境に応じて実行してくだせぇ。

例えばこの記事書いてる時点(2024-04-13)ではLinux向けシステムインストール(sudo必須)が

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

ユーザーインストール(sudo不要)が

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

で、macOS向け(sudo必須)が

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

みたい。

実行後は環境変数再読み込みしたりする必要があるのでターミナル開き直すなりexec bash -l叩くなりしてシェルを再起動してインスコ終わり!閉t...まだ終わりませんよこの記事。

実 際 に 使 っ て み た

...とその前に

インスコ終わったし早速使ってみよう!...ってやりたいんですが、めっちゃやりたいんですが、その前に。
こっから使うflakesという機能(と何故かnixコマンド自体)が現状実験的機能の位置づけらしく、毎回毎回それを有効化するオプション付けてたら長ったらしいのでコンフィグ書きましょう。

多分デフォルトでは~/.config/nixは存在しないのでmkdirで作ってもらうとして、これ↓をぶち込めばいいわけですね。

experimental-features = flakes nix-command

あとflakesがgitベースで色々やる関係でgitも必要になるので各々brewだのaptだのpacmanだのyumだのdnfだのyayだので入れるべし(RHEL系ってパッケージマネージャ多くない...?)

気を取り直して

今度こそ準備が終わったので早速使っていくわけですが。Nixには色んな使い方があります。
NixOSのようにシステム全体を管理したり、home-managerのようにユーザー環境を管理したり色々な使い方はあるけども、
あくまで入門なので取り敢えず一番影響の小さい「開発環境の構築」のために使う体で行こう。

ってなわけで適当なディレクトリ作って中入って、どうぞ。

中に入ったらgit init叩いたらコイツ↓を作りましょう。(nix flake initでもいいけど拡張性が微妙故...)

{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
  };
  outputs = inputs: {
    devShells = inputs.flake-utils.lib.eachDefaultSystem (system: let
      pkgs = import inputs.nixpkgs {
        inherit system;
      };
    in {
      default = pkgs.mkShell {
        packages = with pkgs; [
          git
          neovim
          nodePackages.yarn
          nodejs-slim
        ];
      };
    });
  };
}

...Nix言語に関してはNix入門読んでもらうとして、詳細はともかく一旦やってみよう。
先のセクションで言った通りflakeはgitのステージを見てるらしいのでgit add .をお忘れなく。

nix developと一言発すれば、目の前には既にGit・Neovim・Node.js・yarnが用意されたJavaScript開発環境。素敵でしょう?
もし宗教上の理由でyarnが使えないのであればflake.nixnodePackages.yarnnodePackages.pnpmとかに変えるだけで簡単に適合できる。

もちろん、JavaScriptにとどまらず、C++だろうがGoだろうがZigだろうがRustだろうがかの忌まわしきPython(思想強)だろうがflake.nixに必要パッケージの情報さえ書いていれば同じ開発環境をいくらでも量産できる。
これでもうチーム開発で全員のPCの環境を入念にチェックしながら揃える呪縛からは開放されるわけです。どうです?使いたくなったでしょう?

最後に

さて、現在は...2024-04-14T00:37:50+09:00ですか。まだこんな時間なのに深夜テンションでここまで書いてしまった...絶対どっかガバってるだろうけど一旦公開するか...

...というわけで。いかがだったでしょう?この記事は何気に半年ぐらい前に作ったまま放ったらかしにされてたこのブログの初記事となるわけですが、初っ端からこんな思想の強い記事が投げられてると先が思いやられる...

まぁ、Nixは本当に便利だしNixOSも地獄みたいに情報が少ない(英語の情報ですら少ないしArch Wikiがほぼ通用しない)けどハマる人にはハマるのでまたNix沼にお越しの際はどうか一度触れてみてはいかが?

またこんど!