使用niv管理固定版本Nix包时遇错误求助
问题:使用niv固定工具版本时导入jq报错
我正在学习用nix-shell搭建可复现的开发与DevOps环境,希望在shell.nix里固定kustomize、git等工具的版本,而非固定nixpkgs版本。按照niv官方入门指南,我执行了niv init创建项目、niv add stedolan/jq添加包,sources.json已更新。随后编辑shell.nix如下:
let sources = import ./nix/sources.nix; pkgs = import sources.nixpkgs { }; jq = import sources.jq { }; in pkgs.mkShell { buildInputs = [ pkgs.vim pkgs.niv jq ]; }
但每次运行nix-shell都报错:
error: opening file '/nix/store/lz1m9sv79l0d0lkjm2acnxyx1avnzahk-jq-src/default.nix': No such file or directory (use '--show-trace' to show detailed location information)
环境信息:
- nix-shell (Nix) 2.13.3
- niv 0.2.22
- Debian GNU/Linux 11 (bullseye)
解决方法
问题根源
stedolan/jq的源码仓库本身没有提供default.nix构建文件,直接用import sources.jq { }无法让Nix完成构建——niv仅负责拉取源码,不会自动生成Nix构建配置。
方案1:通过nixpkgs固定jq版本(推荐)
如果只是要固定jq的具体版本,无需直接从源码仓库拉取,可以通过以下步骤操作:
- 删除现有无效的jq源:
niv drop stedolan/jq - 添加nixpkgs中指定版本的jq包:
niv add nixpkgs/jq -v 1.6 - 修改shell.nix为:
let sources = import ./nix/sources.nix; pkgs = import sources.nixpkgs { }; jq = import sources.jq { inherit pkgs; }; in pkgs.mkShell { buildInputs = [ pkgs.vim pkgs.niv jq ]; }
方案2:基于拉取的jq源码构建
如果必须使用stedolan/jq的源码,可借助nixpkgs中已有的jq构建脚本编译:
let sources = import ./nix/sources.nix; pkgs = import sources.nixpkgs { }; # 复用nixpkgs的jq构建逻辑,指定拉取的源码作为构建源 jq = pkgs.callPackage (pkgs.jq.src.override { src = sources.jq; }) { }; in pkgs.mkShell { buildInputs = [ pkgs.vim pkgs.niv jq ]; }
扩展说明
对于kustomize、git这类工具,同样适用上述方案:
- 要么通过固定nixpkgs的特定版本,间接锁定工具版本;
- 要么用
niv add nixpkgs/<工具名> -v <版本号>添加指定版本的工具包,再在shell.nix中导入时传入pkgs参数。
内容的提问来源于stack exchange,提问作者hacb
相关产品推荐
相关产品推荐

