使用flake.nix时出现“Dependency is not of a valid type”错误如何调试?
问题原因与调试修复方案
错误根源
你遇到的类型错误是因为pkgs.mkShell的packages列表要求每个元素都是Nix derivation(实际的包对象),但你现在传入的是整个属性集{ swag = ...; },而非属性集里的swag包本身。
调试步骤
- 单独验证自定义包:在项目根目录执行
nix repl,输入以下命令检查导入结果:
会看到返回的是包含pkgs = import nixpkgs { system = "x86_64-linux"; }; # 替换为你的系统架构 import ./.deps/swag.nix { inherit pkgs; }swag属性的集合,而非单个derivation,这就验证了类型不匹配的问题。 - 添加追踪日志:在flake.nix里用
builtins.trace打印导入内容,直观查看传入的类型:
运行devShells.default = pkgs.mkShell { packages = [ (builtins.trace "导入的内容:" (import ./.deps/swag.nix { inherit pkgs; })) ]; };nix develop时会在终端输出导入的属性集,确认问题所在。 - 核对参数要求:确认
pkgs.mkShell的packages参数接受的是derivation列表,而非属性集或其他类型。
修复方案
有两种可选方式:
方式1:修改flake.nix,提取属性集里的swag包
调整packages列表的元素,明确取出属性集中的swag derivation:
{ inputs = { flake-utils.url = "github:numtide/flake-utils"; nixpkgs.url = "github:nixos/nixpkgs"; }; outputs = { self, nixpkgs, flake-utils }: flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; }; customSwag = import ./.deps/swag.nix { inherit pkgs; }; in { devShells.default = pkgs.mkShell { packages = [ customSwag.swag ]; }; }); }
方式2:修改swag.nix,直接返回derivation
把swag.nix改成直接输出buildGoModule的结果,而非包裹在属性集里:
# .deps/swag.nix { pkgs }: pkgs.buildGoModule rec { name = "go-swag-1.8.1"; version = "1.8.1"; src = pkgs.fetchFromGitHub { owner = "swaggo"; repo = "swag"; rev = "v${version}"; sha256 = "sha256-r19SYRHewbPL6S7bZGGqJk9QX8V9IxmRx3zyDeKGdn0="; }; vendorHash = "sha256-QphjiJSQRULphWjrJ8RzrUblTDYL/fYoSNT3+g0tP48="; subPackages = [ "cmd/swag" ]; }
此时flake.nix里的packages可以保持原来的写法:
packages = [ (import ./.deps/swag.nix { inherit pkgs; }) ];
内容的提问来源于stack exchange,提问作者MatrixManAtYrService
相关产品推荐
相关产品推荐

