使用Flake部署Node.js/MongoDB时遇mkShell非函数错误求助
解决Nix Flake开发环境配置错误
错误原因
- 语法结构错误:你的
outputs定义中,mkShell结束后直接追加了一个独立的配置set,导致Nix解析时误将mkShell返回的set当作函数调用,触发“attempt to call something which is not a function but a set”错误。 - 非自由软件配置位置错误:
nixpkgs.config不能直接放在outputs顶层,需要在实例化nixpkgs时传入,才能让Nix识别非自由软件的允许规则。
修正后的配置
{ description = "Installing Nodejs with a flake"; inputs = { nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-23.11"; }; outputs = { self, nixpkgs-stable, ... }: let # 实例化带非自由软件配置的nixpkgs pkgs = import nixpkgs-stable { system = "x86_64-linux"; config = { allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [ "mongodb" "mongosh" # 注意:mongosh也需要加入允许列表 ]; }; }; in { devShells.x86_64-linux.TestingNodejsFlake = pkgs.mkShell { buildInputs = [ pkgs.nodejs pkgs.mongodb pkgs.mongosh ]; }; }; }
修改说明
- 将nixpkgs的实例化逻辑放入
let块,通过import传入config参数,指定允许的非自由软件包(包括mongosh,因为它同样属于非自由软件)。 - 修正
outputs的结构,确保devShells是顶层唯一的set成员,避免语法解析错误。 - 所有包引用都改为从实例化后的
pkgs中获取,确保使用的是带有非自由配置的包集合。
验证
保存修正后的flake.nix,执行以下命令测试:
nix develop
进入开发环境后,可通过node --version、mongod --version、mongosh --version验证软件是否正常安装。
内容的提问来源于stack exchange,提问作者Blomiir
相关产品推荐
相关产品推荐

