OFFSET偏移
← 文章目录OFFSET / FIELD NOTESNO. 025

Flake 结构:inputs 与 outputs

理解 Flake 输入、输出以及 self 和参数捕获的层级。

所在专题Flakes:项目与依赖管理 ↗
约 3 分钟阅读开始阅读

Flake 的基本结构#

一个典型的 flake.nix 是属性集,其中 outputs 是接收输入并返回输出属性集的函数。

{
  description = "我的 NixOS 配置";

  inputs = {
    # 这里定义依赖
    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
    home-manager.url = "github:nix-community/home-manager";
  };

  outputs = { self, nixpkgs, ... }@inputs: {
    # 这里定义产出(系统配置、软件包、Shell 环境等)
    nixosConfigurations.my-host = nixpkgs.lib.nixosSystem {
      system = "x86_64-linux";
      modules = [ ./configuration.nix ];
    };
  };
}

1. Inputs (输入)#

inputs 是你要引用的外部资源。

  • nixpkgs:整个软件仓库。

  • home-manager:用户层配置工具。

  • flake-utils:一个常用的辅助库。

  • follows 关键字:非常重要!它让指定的子输入跟随顶层 nixpkgs,减少依赖图中的重复 nixpkgs 来源;仍可能存在多个包版本,且共享输入不保证所有外部项目兼容。

    home-manager.inputs.nixpkgs.follows = "nixpkgs";

2. Outputs (输出)#

outputs 是你这个 Flake 制造出来的东西.

  • nixosConfigurations:供 nixos-rebuild 使用,核心是你的系统。
  • homeConfigurations:供 home-manager 使用。
  • devShells:供 nix develop 使用的开发环境。
  • packages:你自己打包的软件。

这里的 self 和 @inputs 是什么?#

  • self:代表当前的 Flake 自身。你可以通过它引用自己定义的子文件。
  • @inputs:语法糖,表示把所有的输入参数一起捕获。

实战技巧:看懂 outputs 的层级#

如果你运行 nix flake show,你会看到树状的输出。在代码里,这些层级必须严丝合缝地对上,nixos-rebuild 才能找到你的配置。

参考与延伸

  1. Nix Flake 手册 ↗
  2. Nix flake update ↗
  3. Nix flake check ↗

根据技术笔记重新整理,示例使用通用名称。

沿专题继续阅读

Flakes:项目与依赖管理

  1. 01Flake 结构:inputs 与 outputs
  2. 02flake.lock 与可复现性
  3. 03Flake Utils 与项目模板
  4. 04外部 Flake 引用与协作
  5. 05将 NixOS 配置迁移到 Flakes
  6. 06Flakes 项目与依赖管理教程
  7. 07Flake 更新机制
  8. 08flake.lock 回退与手动编辑
CONTINUE READING / 下一篇flake.lock 与可复现性

用版本锁定记录依赖来源,同时理解复现结果的条件。