如何在Nix Flake中定义默认包以构建所有其他Flake包
如何在Nix Flake中定义默认包以构建所有其他Flake包
嘿,针对你想让nix build默认构建Flake里所有三个包(a、b、c)的需求,我有几个实用的方案分享给你~
核心思路是把packages.default定义成一个依赖所有目标包的派生,这样Nix在构建默认包时,会自动把所有依赖的a、b、c都构建出来。下面是具体实现方式:
方案1:用linkFarm生成包含所有包的目录
这种方式会生成一个目录,里面是指向a、b、c三个包的符号链接,既满足构建所有包的需求,还能在最终结果里直接访问这些包:
{ inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; }; outputs = { self, nixpkgs }: let pkgs = import nixpkgs { system = "x86_64-linux"; }; # 替换成你的目标系统 in { packages.x86_64-linux = { # 这里是你的三个包定义 a = pkgs.writeScript "a" "#!/bin/sh\necho Hello from package a!"; b = pkgs.writeScript "b" "#!/bin/sh\necho Hello from package b!"; c = pkgs.writeScript "c" "#!/bin/sh\necho Hello from package c!"; # 定义默认包,包含a、b、c default = pkgs.linkFarm "all-packages" [ { name = "a"; path = self.packages.x86_64-linux.a; } { name = "b"; path = self.packages.x86_64-linux.b; } { name = "c"; path = self.packages.x86_64-linux.c; } ]; }; }; }
配置好后运行nix build,你会得到一个result目录,里面有a、b、c三个链接,指向各自的包目录,而且三个包都已经被构建到Nix Store里了。
方案2:用runCommand创建空派生(仅构建依赖)
如果你不需要最终的链接目录,只是想确保三个包都被构建,可以用这种方式:
default = pkgs.runCommand "build-all-packages" { # 声明依赖a、b、c,Nix会自动构建它们 buildInputs = [ self.packages.x86_64-linux.a self.packages.x86_64-linux.b self.packages.x86_64-linux.c ]; } '' touch $out # 生成一个空的输出文件 '';
运行nix build后,虽然最终的result只是一个空文件,但a、b、c三个包已经被成功构建,你可以通过nix path-info命令查看它们的存储路径。
进阶:适配多系统
如果你需要支持多个系统架构,可以用genAttrs来简化配置,避免重复代码:
{ inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; }; outputs = { self, nixpkgs }: let supportedSystems = [ "x86_64-linux" "aarch64-linux" ]; # 遍历所有支持的系统 forAllSystems = f: nixpkgs.lib.genAttrs supportedSystems (system: f (import nixpkgs { inherit system; })); in { packages = forAllSystems (pkgs: { a = pkgs.writeScript "a" "#!/bin/sh\necho Hello from package a!"; b = pkgs.writeScript "b" "#!/bin/sh\necho Hello from package b!"; c = pkgs.writeScript "c" "#!/bin/sh\necho Hello from package c!"; default = pkgs.linkFarm "all-packages" [ { name = "a"; path = self.packages.${pkgs.system}.a; } { name = "b"; path = self.packages.${pkgs.system}.b; } { name = "c"; path = self.packages.${pkgs.system}.c; } ]; }); }; }
这样不管你在x86还是ARM架构上运行nix build,都能正确构建对应系统的a、b、c包作为默认目标。
备注:内容来源于stack exchange,提问作者Peter Becich
相关产品推荐
相关产品推荐

