Nix用いたツール実行・開発環境の構築方法

要約 この記事では、Pythonでいうvirtualenv的なことをする方法について述べる。つまり、ツールを一時的に導入したり、ツールが実行可能な開発環境を整備したりする目的として、以下の話題を扱う。 各種コマンド nix shell nix run nix develop direnv + nix-direnv nix flake init にtemplateを指定する方法 なお本記事ではNixOS固有の話ではなく、(パッケージマネージャとしての)Nixを使う場合の話をする。使用するNixとhome-managerのバージョンは以下の通り。 1 2 3 4 ~ $ nix --version nix (Nix) 2.18.1 ~ $ home-manager --version 24.05-pre はじめに Nixではユーザ環境にパッケージを入れるために、以下の2つのどちらかを使うはず(宣言的に管理できる後者がよりデファクトになっている気がする)。 nix-env home-manager これらは永続的にパッケージを導入する仕組みであるが、そうではなく一時的にパッケージを導入したいという場合があるだろう。具体的には、以下の2つの場合がありえる。 あるツールを使いたいが、別に永続的にそれを使う必要はない。試しに使ってみたい場合は、ある瞬間にそれが使えれば十分 virtualenvみたいに、開発時のみに特定のバージョンの開発ツールが導入されている状態であってほしい 前者の場合、nix shell、nix runコマンドを用いる。後者の場合、nix developコマンドを用いる。 nix shellコマンド nix shell コマンドを用いると、一時的にパッケージを導入して新しいshellに入ることができる。 以下のように使うと、パッケージを導入した状態で新しいshellに入る。パッケージは複数指定が可能。 1 nix shell (package name) (package name) ... 以下は、nix shell コマンドを用いてgccを使える状態にする例。 1 2 3 4 5 6 ~ $ nix shell nixpkgs#gcc ~ $ gcc --version gcc (GCC) 13....

2024-05-13 · (updated 2024-07-20) · 9 min · 1832 words

Nixのパッケージ・derivationの探り方まとめ

Nixで、あるパッケージがどのパッケージに依存しているのかを調べたくなったのを発端に、パッケージやその依存関係の調べ方についていろいろ調べた。 要約 アプリ・ツールがどのパッケージに収録されているのかを知る NixOS Search や nix search コマンドを使う which や realpath コマンドから /nix/store 下のディレクトリがわかるのでそこからパッケージ名を知る nix-index、 nix-index-databaseを使う derivationの詳細を知る: nix derivation show [drv or output] output ⇔ derivation outputがどのderivationでビルドされたのかを知る: niq-store --query --deriver [output] derivationのoutputを知る: nix-store --query --outputs [drv] derivationについて build dependenciesを知る: nix-store --query --references [drv] 間接的なbuild dependenciesもすべて知る: nix-store --query --requisites [drv] outputについて runtime dependenciesを知る: nix-store --query --references [output] 間接的なruntime dependenciesもすべて知る: nix-store --query --requisites [output] 前置き 用語解説 いろいろとNix固有(?)の言葉が出てくるため、ここでまとめて解説しておく。 GlossaryとNix Pills Chapter9を参考にする。 パッケージ:ファイルやデータの集まり。 derivation:何らかのビルドタスクを行うための記述書。端的にはパッケージを作るための仕様書である。次の節で詳しく述べる output:derivationから生成されたもの store object:Nixによって管理されているあらゆるオブジェクトをさす。通常は/nix/store/に保管されているはず store path:store objectが置かれている場所。通常は/nix/store/にあるはず build depencencies:ビルドの時点で必要になる依存関係。ビルドに必要なソースコードや、derivationの中で参照されている別のderivationを指す。これはderivationに記載されている runtime dependencies:実行時に必要になる依存関係。動的ライブラリや、ほかのパッケージの実行ファイルなどを指す これを検出する方法は素朴で、生成したパッケージをNAR形式で固め、そこに埋め込まれているoutputのパスがruntime dependenciesと判定するだけである NAR (Nix Archive):tarのように複数ファイルを1つのファイルに固めた形式。ただし、同じアーカイブ対象であればまったく同じNARファイルができるように、tarに比べてシンプルなつくりになっている。例えば、tarだとアーカイブする度にタイムスタンプ(mtimeフィールド)が埋め込まれるが、NARにはそれがない(参考) NARが作られた背景について、edolstra氏のPh....

2024-04-04 · (updated 2024-09-17) · 6 min · 1098 words

NixOSをWSL2上で構築したときのメモ

年末からお正月の間帰省したときにWindowsのラップトップを持っていった。しかしWSL2にはUbuntuしか入っておらず、最近デスクトップで使っているNixOSが入っていなかった。そこで試しに構築してみたときのメモ。最低限コーディングができる環境が整った。 (IT系あるあるだけれど)NixOS-WSLの開発はまあまあ早いため、ここに書いてある内容もすぐ陳腐化してしまいそう。 インストール RepositoryのReleasesからnixos-wsl.tar.gzをDLしてくる コマンドプロンプト or PowerShell で以下のコマンドを実行 1 2 3 wsl --import NixOS .\NixOS\ nixos-wsl.tar.gz --version 2 wsl -d NixOS nix-channel --update Flake化による初回セットアップ 今回はなるべくnix-channelを使わず、flake.nixからなるべく必要なファイルを入れるようにしたい。そのほうが、今後再セットアップするときにそのflakeファイルを指定するだけで環境が構築できることを期待しているため。 とはいえ、現状のNixOSにはVimもGitも入っておらず限界があるので、それはChannelから入手する。まず現時点での最新版のnixosのChannelを登録する。 1 2 sudo nix-channel --add https://nixos.org/channels/nixos-23.11 nixos sudo nix-channel --update 次にVimとGitを入れる。Vimはテキスト編集のため、Gitはnix-flakeの動作のために必要。 1 nix-shell -p vim git NixOSで最強のLinuxデスクトップを作ろうやUsing nix flakes with NixOSに書かれている内容を参考に進めていく。 まずホームディレクトリに移動し、適当なディレクトリnixos-configを作り、そこにNixOSの設定ファイル(configuration.nix)を持ってくる。 1 2 3 4 cd ~ mkdir nixos-config cd nixos-config cp /etc/nixos/* . flake.nixを作成し以下のようにする。 inputsにnixosのリポジトリと、NixOS-WSLのリポジトリを指定する inputsの書き方はattribute setとurl-likeな書き方の2種類がある。url-likeな書き方だとtag指定の方法がわからなかったので、NixOS-WSLのinputに関してはattribute setで書いている nixosSystemの引数としてspecialArgsが指定でき、これでconfiguration.nixに引数を渡せる 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 { inputs = { nixos....

2024-01-13 · (updated 2024-01-14) · 3 min · 610 words