You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 07:11:17