20190801:nixのメンタルモデル
nixとは
The Purely Functional Package Manager
ところで関数型って?
以下オタクの考える関数型を省略
package manager ?
brew
mac用
apt
debian用
npm
取り出しやすいゴミ箱?
package managerの役割とは?
ダウンロード?
依存関係の解決?
どのソフトウェアをインストールできるか確認できる?
.zshrcを勝手に編集してPATHを通す?
キャッシュ?
ソースコードからビルド?
最低限できてほしいこと
適切なディレクトリにソフトウェアを保存する
依存したものも適切な場所に保存される
勝手に変化しない
補足:実行者とソフトウェアは別だ。変化しうるものは実行者が管理するディレクトリに保存するべき。
🤔 auto update...
シナリオ
👺「ソフトウェア開発をします。対応するmysqlは5.5と5.6と5.7です。全部に手元でテストできるようにしといてください」
hiroqn.icon「とりあえず、/izon/mysql/5.5、/izon/mysql/5.6、/izon/mysql/5.7でビルドしよう」
hiroqn.icon 「お、mysql5.7は依存にprotobufとlibevent増えているから、/izon/libeventとかに増やすか」
hiroqn.icon 「あ、protobufはそういえば別プロジェクトで使ってたのとバージョンが違うから/izon/protobuf/x.x...」
hiroqn.icon 「さて自分の環境はできたけど、他の人のセットアップ用のコードを作らなきゃ、cmakeとか入ってない人もいそうだな。」
課題
自分の環境に入っているものに依存すると、他の人の環境で再現するかわからない
共通のディレクトリを作るなら、完全に同じものないといけない(/izon/protobuf)
/usr/local/に全て入れて、ファイル名で一致を頑張るのは無駄
とはいえ、手動で上記をやるのは無理
nixが解決してくれます
nix-langを使って依存とビルド方法を記述すると、uniqueなディレクトリを作ってくれる
mysqlの例
手元のNodejsの様子
https://gyazo.com/1b094338c1ce6f61a3c34d68d8a84a44
10.15.3が二つあるが、おそらく何らかの依存が違うために二つ作られている(=厳密)
最後に
nixを使ってkernelとか設定まで管理するとnixos
nixを使うために書く言語がnix-lang
nix-langで書かれたレシピが集まっているのがnixpkgs
20190801