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

Nix配置中system系统变量的来源是什么?

Nix模块中system变量的来源原理

我的flake.nix配置

{
  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
    home-manager = {
      url = "github:nix-community/home-manager";
      inputs.nixpkgs.follows = "nixpkgs";
    };
    disko = {
      url = "github:nix-community/disko";
      inputs.nixpkgs.follows = "nixpkgs";
    };
    scripts = {
      url = "./scripts/";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs = {
    self, nixpkgs, disko, ...} @ inputs: {
    nixosConfigurations.HostName = nixpkgs.lib.nixosSystem {
      specialArgs = {inherit inputs;};
      modules = [
        ./hosts/HostName/configuration.nix
        inputs.home-manager.nixosModules.default
        disko.nixosModules.disko
      ];
    };
}

我的configuration.nix配置

{
  config,
  pkgs,
  inputs,
  scripts,
  ...
}: {
  # 省略其他配置

  environment.systemPackages = with pkgs; [
    inputs.scripts.packages.${system}.fooScript
    ];
}

问题:system变量的来源是什么?

我没有手动把system传入模块,但却能直接使用它,这一机制的原理是什么?

原理说明

system是NixOS模块系统自动注入的内置参数,不需要手动传入,整个流程逻辑如下:

  • 当你调用nixpkgs.lib.nixosSystem构建系统配置时,这个函数会自动确定目标系统架构(比如x86_64-linux或aarch64-darwin):你可以通过显式指定system参数覆盖默认值,否则它会自动从运行nix命令的主机环境推断架构。
  • NixOS的模块系统会把这个确定好的system参数,自动传递给所有加载的模块(包括你的configuration.nix),所以你在模块里可以直接引用它,无需额外定义或通过specialArgs传递。

额外补充:你代码里的pkgs其实也是基于这个system参数从nixpkgs实例化而来的,和inputs.scripts.packages.${system}使用的是同一个系统架构标识,这保证了你安装的包和当前系统架构兼容。

内容的提问来源于stack exchange,提问作者2e0byo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 10:29:51