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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 12:44:35