第三話 ブログの開発環境を Nix する

2025-03-19

特定プロジェクト用の開発環境を整える→開発用マシンの構成管理を Nix で行う→(必要であれば)Nix パッケージを作成する

おおよそ上記のような順番で難易度が上がっていき、初心者にはその順番で学習していくことが薦められていると感じた。そのため、このブログ用の開発環境を作成してみた。

大概のブログと同様、このブログでは Node を使っていて、開発用に nix-shell で使えるようにした:https://github.com/yutatokoi/blog/commit/71319ea6f11eaf6cf57838caa8b7d0adbbc57627

nix-shell での書き方はどうやら少し古いらしい。最近は Nix flake を活用した nix develop の方が一部では好まれていて、こちらの方が再現性が良いのだとか。Nix の分かりづらさの大きい要因として、あまりにも選択肢が多すぎて、それらがコロコロ変わっていること。まだ活用方法が定まっていないとなると、会社の業務では手を出しづらそうではある。

開発環境ができたものの、今の状態ではあまりありがたみを感じられない。というのも、Homebrew を使っていた状態でブログの開発に問題があったわけではなく、大量のパッケージやツールを利用していたわけでもなく、長期に及んでの開発を行ってきたわけでもないので。ただ、(相変わらず沢山の文章を読んだり動画を観たりすれば)非常に簡単にできて、nix-shell というコマンドを打つというステップが一つ増えただけで、以前と同じ状態で開発できている。

ローカル開発環境における Docker と nix-shell の違いについてのディスカッション(2018年〜2019年):https://discourse.nixos.org/t/is-there-much-difference-between-using-nix-shell-and-docker-for-local-development/807。TL;DR Docker より Nix で開発環境を構築する方が再現性が高い。これは Docker が命令型であるのに対して、Nix は宣言型であるから。Docker で使う apt-get updateapt-get install ...wget ...のようなコマンドたちは、ソースが変わってしまえば出来上がるイメージも変わる。それに対し、Nixでは特定のコミットハッシュを基に構成されるため、毎回同じソースを参照する。かなり前の情報ではあるが、今でも同じだと思う。

また、flakes.nix で Flakes を活用した方法以外にも devenv というツールがある:https://devenv.sh/。もっと複雑な開発環境の構築が必要になれば検討するのも良い。