使用Nix编译llm库:指定unstable却用rustc 1.69的原因排查
Nix指定nixpkgs-unstable却使用rustc 1.69导致构建失败的解决方法
问题场景
尝试通过Nix安装llm库,执行步骤:
git clone https://github.com/rustformers/llm.git nix build
构建失败,报错显示half v2.3.1要求rustc 1.70或更高版本,但当前环境rustc版本为1.69.0。项目flake.nix已指定nixpkgs-unstable:
inputs = { nixpkgs.url = github:nixos/nixpkgs/nixpkgs-unstable; naersk.url = github:nix-community/naersk; flake-utils.url = github:numtide/flake-utils; };
查询得知nixpkgs-unstable包含rustc 1.70,stable版本为1.69。执行nix develop -i && cargo build --release仍报错,rustc版本依旧是1.69。
可能原因
- flake.lock锁定了旧版nixpkgs:之前生成的lock文件可能对应较早的unstable分支,当时rustc还未更新到1.70。
- 依赖工具冲突:naersk或flake-utils可能默认依赖stable版本的nixpkgs,导致实际使用的rustc来自stable分支。
- devShell配置未明确指定:flake的devShell若未绑定unstable的nixpkgs,会 fallback 到系统默认版本。
解决步骤
1. 更新flake.lock中的nixpkgs
删除旧lock文件,重新拉取最新unstable分支:
rm flake.lock nix build --refresh
重新生成的flake.lock会确保nixpkgs为最新unstable版本,包含rustc 1.70+。
2. 让naersk使用项目指定的nixpkgs
修改flake.nix中naersk的调用,强制它使用项目的nixpkgs输入:
outputs = { self, nixpkgs, naersk, flake-utils }: flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; }; # 覆盖naersk的pkgs依赖为当前项目的nixpkgs naersk-lib = naersk.lib."${system}".override { inherit pkgs; }; in { packages.default = naersk-lib.buildPackage { pname = "llm"; src = self; # 保留原有构建配置 }; devShells.default = pkgs.mkShell { buildInputs = [ pkgs.rustc pkgs.cargo ]; }; } );
3. 强制devShell使用unstable的rust工具链
确保devShell明确引入unstable中的rustc和cargo:
devShells.default = pkgs.mkShell { buildInputs = with pkgs; [ rustc cargo ]; };
重新进入开发环境并检查版本:
nix develop --refresh rustc --version
此时应显示1.70或更高版本。
4. 临时指定unstable rust环境构建
若不想修改flake配置,可直接用unstable的rust工具链临时构建:
nix-shell -p nixpkgs-unstable.rustc nixpkgs-unstable.cargo --run "cargo build --release"
内容的提问来源于stack exchange,提问作者Pierre-olivier Gendraud
相关产品推荐
相关产品推荐

