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
相关产品推荐
相关产品推荐

