如何通过mkShell将任意Nix Flake整合进Flake开发Shell环境?
问题描述
我现有用于Rust开发的Shell环境,对应的flake.nix配置如下:
{ inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; rust-overlay.url = "github:oxalica/rust-overlay"; }; outputs = { self, nixpkgs, flake-utils, rust-overlay, ... }: let systems = [ "x86_64-linux" "x86_64-darwin" "aarch64-darwin" ]; in flake-utils.lib.eachSystem systems (system: let pkgs = import nixpkgs { inherit system; overlays = [ (import rust-overlay) ]; }; in { devShell = pkgs.mkShell { packages = [ pkgs.rust-bin.nightly."2023-04-30".default pkgs.rust-analyzer pkgs.samply ]; RUST_BACKTRACE = 1; }; }); }
对应的.envrc配置为:
#!/usr/bin/env bash use flake
现在我想在这个环境中添加Kani Rust验证工具,已有对应的Flake包装,且单独执行nix shell github:fd/nix-kani可以正常运行。但我尝试整合到mkShell的修改失败了,我的修改内容如下:
@@ -5,5 +5,6 @@ rust-overlay.url = "github:oxalica/rust-overlay"; + nix-kani.url = "github:fd/nix-kani"; }; - outputs = { self, nixpkgs, flake-utils, rust-overlay, ... }: + outputs = { self, nixpkgs, flake-utils, rust-overlay, nix-kani, ... }: let @@ -17,2 +18,3 @@ }; + kani = import nix-kani { inherit system; }; in @@ -24,2 +26,3 @@ pkgs.samply + kani.packages ];
请问如何正确将这个Flake整合进mkShell环境?
正确整合方法
你的问题出在对Flake输入的使用方式上——nix-kani本身是完整的Flake,不是普通Nix模块或Overlay,不能用import加载。正确做法是直接引用它的packages输出并匹配当前系统。
修改后的完整flake.nix如下:
{ inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; rust-overlay.url = "github:oxalica/rust-overlay"; nix-kani.url = "github:fd/nix-kani"; # 添加flake输入 }; outputs = { self, nixpkgs, flake-utils, rust-overlay, nix-kani, ... }: let systems = [ "x86_64-linux" "x86_64-darwin" "aarch64-darwin" ]; in flake-utils.lib.eachSystem systems (system: let pkgs = import nixpkgs { inherit system; overlays = [ (import rust-overlay) ]; }; # 直接引用nix-kani对应系统的默认包 kani = nix-kani.packages.${system}.default; in { devShell = pkgs.mkShell { packages = [ pkgs.rust-bin.nightly."2023-04-30".default pkgs.rust-analyzer pkgs.samply kani # 添加到packages列表 ]; RUST_BACKTRACE = 1; }; }); }
关键修改说明
- 添加Flake输入:在
inputs中加入nix-kani的地址,与其他输入保持一致。 - 引用Flake输出:在每个系统上下文里,通过
nix-kani.packages.${system}.default获取对应系统的Kani包——Flake的packages结构按系统划分,default是该Flake提供的默认工具包集合。 - 加入mkShell的packages:把获取到的
kani变量直接加入packages列表即可,无需使用kani.packages(这是之前的错误点,kani本身就是包,不是包集合)。
修改完成后,重新执行direnv allow(若使用direnv)或直接nix develop,即可在开发Shell中使用Kani的相关命令。
内容的提问来源于stack exchange,提问作者edwardw
相关产品推荐
相关产品推荐

