无需不同架构机器,如何获取多架构fetchurl的SHA256校验码?
无需跨架构机器获取Nix多架构二进制文件哈希的方法
方法1:直接用nix-prefetch-url计算哈希
不需要构建完整derivation,直接通过命令行工具下载对应架构的文件并生成哈希:
# 获取x86_64-linux版本的哈希 nix-prefetch-url https://github.com/myorg/myapp/releases/download/v1.32.0/myapp_1.32.0_linux_amd64.tar.gz # 获取aarch64-linux版本的哈希 nix-prefetch-url https://github.com/myorg/myapp/releases/download/v1.32.0/myapp_1.32.0_linux_arm64.tar.gz # 同理处理x86_64-darwin和aarch64-darwin版本
命令执行后会直接输出对应的sha256哈希值,复制到你的derivation中对应架构的checksum字段即可。
方法2:批量构建fetchurl derivation获取哈希
调整代码,让Nix一次性尝试构建所有架构的文件下载任务,逐个获取真实哈希:
- 创建临时文件
fetch-all.nix:
{ pkgs }: let archFiles = { "x86_64-linux" = "myapp_1.32.0_linux_amd64.tar.gz"; "aarch64-linux" = "myapp_1.32.0_linux_arm64.tar.gz"; "x86_64-darwin" = "myapp_1.32.0_darwin_amd64.tar.gz"; "aarch64-darwin" = "myapp_1.32.0_darwin_arm64.tar.gz"; }; fetchArch = file: pkgs.fetchurl { url = "https://github.com/myorg/myapp/releases/download/v1.32.0/${file}"; sha256 = pkgs.lib.fakeSha256; }; in builtins.mapAttrs (name: file: fetchArch file) archFiles
- 运行
nix-build fetch-all.nix,Nix会依次尝试构建每个架构的下载任务,每次哈希不匹配时都会输出真实值,你可以逐个记录并更新到原derivation中。
方法3:通过Flake批量触发多架构哈希验证
修改Flake配置,为所有系统生成单独的fetchurl输出,然后逐个触发构建获取哈希:
- 更新Flake的
outputs部分:
{ inputs = { flake-utils.url = "github:numtide/flake-utils"; nixpkgs.url = "github:nixos/nixpkgs"; }; outputs = { self, nixpkgs, flake-utils }: let allSystems = flake-utils.lib.allSystems; forAllSystems = f: flake-utils.lib.eachSystem allSystems f; in { packages = forAllSystems (system: let pkgs = import nixpkgs { inherit system; }; archFiles = { "x86_64-linux" = "myapp_1.32.0_linux_amd64.tar.gz"; "aarch64-linux" = "myapp_1.32.0_linux_arm64.tar.gz"; "x86_64-darwin" = "myapp_1.32.0_darwin_amd64.tar.gz"; "aarch64-darwin" = "myapp_1.32.0_darwin_arm64.tar.gz"; }; in { myapp-fetch = pkgs.fetchurl { url = "https://github.com/myorg/myapp/releases/download/v1.32.0/${archFiles.${system}}"; sha256 = pkgs.lib.fakeSha256; }; } ); devShells = flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; }; in { default = pkgs.mkShell { packages = [ (import ./deps/myapp.nix { inherit pkgs system; }) ]; }; }); }; }
- 运行以下命令逐个触发构建,获取对应架构的真实哈希:
nix build .#packages.x86_64-linux.myapp-fetch nix build .#packages.aarch64-linux.myapp-fetch nix build .#packages.x86_64-darwin.myapp-fetch nix build .#packages.aarch64-darwin.myapp-fetch
每个命令失败时会输出该架构的正确哈希,记录后更新原derivation即可。
内容的提问来源于stack exchange,提问作者MatrixManAtYrService
相关产品推荐
相关产品推荐

