Nix で Rust の環境を用意してみたのでそれについて書きます。 筆者はNix初心者なので参考にする場合は注意してください。
最終的に完成するものはこちらです:
使うもの
- rustup が提供する Toolchain 機能
- Fenix(nix-community/fenix)
ステップバイステップでやってみる
Gitリポジトリを作成
mkdir rust-nix-fenix-example cd rust-nix-fenix-example git init
利用する Rust ツールチェーンの定義
次に、利用する Rust ツールチェーンの定義をしましょう。rust-toolchain.toml
というファイルを作成し、必要な設定をします。設定できる内容についてはrustupのドキュメントを参照してください。
今回はこのように記述しました:
# rust-toolchain.toml [toolchain] channel = "1.78.0" components = ["rustc", "cargo"] profile = "minimal" targets = []
Flakes を書く
今のところリポジトリには rust-toolchain.toml
しか存在しません。次はFlakesで環境を作りましょう。
flake.nix
というファイルを作成し、次のように記述します。
Fenix を使って rust-toolchain.toml
の内容を読み込み、環境を定義しています。
# flake.nix { description = "Rust environment example"; inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; flake-utils.url = "github:numtide/flake-utils"; fenix = { url = "github:nix-community/fenix/monthly"; inputs.nixpkgs.follows = "nixpkgs"; }; }; outputs = { fenix, flake-utils, nixpkgs, ... }: flake-utils.lib.eachDefaultSystem (system: let toolchain = fenix.packages.${system}.fromToolchainFile { file = ./rust-toolchain.toml; sha256 = "sha256-opUgs6ckUQCyDxcB9Wy51pqhd0MPGHUVbwRKKPGiwZU="; }; pkgs = nixpkgs.legacyPackages.${system}; in { formatter = pkgs.nixpkgs-fmt; devShells.default = pkgs.stdenv.mkDerivation { name = "rust environment"; nativeBuildInputs = [ toolchain ]; }; } ); }
flake.nix を評価して有効化する
flake.nix と rust-toolchain.toml を Git tracked なファイルにしておきます。
git add .
direnv を使って環境を有効化する設定をしている場合は、use flake
と書いた .envrc
をディレクトリに配置し、初回のみ direnv allow を実行します。
echo "use flake" > .envrc direnv allow
direnv を含めた設定方法はこちらの記事に書きました: lemonadern.hatenablog.com
例示した rust-toolchain.toml
の内容を変更した場合は、flake.nixのsha256付近を評価中に次のようなエラーが発生するでしょう。
error: hash mismatch in fixed-output derivation '/nix/store/0iqd8n9gzj5lb3q9x1l9hyqk7dcg7pha-channel-rust-1.77.0.toml.drv': specified: sha256-opUgs6ckUQCyDxcB9Wy51pqhd0MPGHUVbwRKKPGiwZU= got: sha256-+syqAd2kX8KVa8/U2gz3blIQTTsYYt3U63xBWaGOSc8=
flake.nix にて toolchain の sha256 として定義したものは依存先のファイル内容が同じであることを保証するためのハッシュなので、rust-toolchain.tomlを変更した場合はハッシュ値も変更する必要があります。
エラーで新しく提示されたハッシュ値(got:
で示されたほう)でflake.nixの記述を上書きしてください。
Cargo プロジェクトとしてセットアップする
Rustのツールチェーンはインストールできたので、あとはCargoのプロジェクトとしてセットアップするだけです。
cargo init
完成
このようなリポジトリができました:
おわりに
「NixでRust を使うときはなんか Overlay ってやつを使わないといけないらしい。ふんふん、Fenixとかrust-overlay ってのがあるのね、、、えっと、結局どう書けばいいの?」 となってしまったのでこの記事を書きました。
もっと洗練されたやりかたがあるかもとは思うんですが、あくまで1事例として、困っている人の助けになれば嬉しいです。マサカリをお持ちのかたはいい感じに投げてくれると嬉しいです。
参考
こちらの記事でツールチェーンの定義を rust-toolchain.toml に一本化できることを知り、大いに参考にさせてもらいました!助かりました!