nix-shell
globalを汚さずに一時的なshell環境をパパっと作れる
ほぼすべての言語の開発環境をnixのみで構成できる
repositoryにshell.nixを含めておけばチーム全員が同じ環境をsetupできる
nix-buildと異なり、derivationは作らない
docs
Usecases
Libraryの一時使用をしてみる
例えば、ripgrepというコマンドをちょっと触ってみたい、良さそうなら入れたい、というケース
$ nix-shell -p ripgrepとすればripgrepだけが入った環境ができてポチポチ試せる
$ exitすれば環境はresetされ、globalは何も汚れない
nix-shellでprojectごとに環境をsetupする
例えば、Gitのrepositoryごとに「JSの環境構築」と「その際に必要なnpm packageのinstall」を行う
options
引数無しで$ nix-shellを実行すると、
まず同directoryのshell.nixを探し、なければdefault.nixを探して読み込む
https://nixos.org/manual/nix/unstable/command-ref/nix-shell.html#options
かいてる
https://www.mankier.com/1/nix-shell
--pure
読み込んだ設定fileに書いてあるpackageにのみアクセスできるようにする
globalにinstalしているpackageを使用の禁止を強制できる
e.g. $ nix-shell --pure shell.nix
もしglobalでもnixを使ってて、その環境も引き継ぎたいなら--pureを付けずに実行
-p
e.g. $ nix-shell -p ripgrep
--run
コマンドを指定して起動して、一発実行して、終了する #??
e.g. $ nix-shell -p ripgrep --run "rg foo"
dockerのexecに近い #??
--attr
zshの環境を引き継ぐ
zsh-nix-shellを使う
home-managerの設定ファイルにこれを追記
これでnix-shellしても同じpromptで、補完なども効く
普通の状態
https://gyazo.com/755c1e89d536b7f2ef9b47b57e07fc61
cargoはglobalに入っていないので、カニの右側に数値は表示されていない
これ入れる前のnix-shell状態
https://gyazo.com/3a2fb9a00e582e7d72d78cc2912764fd
入れた後のnix-shell状態
https://gyazo.com/0c3729f611e0f13b2c1e8b91ed54d147
cargoが入っているのでversionが出ている
pureしていないのでimpureの表示がある
自動で読み込む
nix-direnv
lorri
#??
version指定どうする?
ruby v3が使いたい、とき
git hashのやつのpinどめ必要になる?
参考
An introduction to nix-shell | Mattia Gheda
tutorial的な記事
最初に読むと良いかも
最初に一般的な例、次にPython, Rust, NodeJS固有の例、などなど
https://nixos.org/guides/nix-pills/developing-with-nix-shell.html