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

使用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的具体版本,无需直接从源码仓库拉取,可以通过以下步骤操作:

  1. 删除现有无效的jq源:niv drop stedolan/jq
  2. 添加nixpkgs中指定版本的jq包:niv add nixpkgs/jq -v 1.6
  3. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 20:44:54