扩展 outputs
框架原生支持 apps、formatter 与 deploy 目录约定。目录不存在或被禁用时不会生成对应 output。
Apps
apps/<name>/default.nix 映射为 apps.<system>.<name>:
# apps/hello/default.nix
{ lib, hello }:
{
type = "app";
program = lib.getExe hello;
}nix run .#hello除普通包参数外,函数还可按需声明 inputs、self、snowveil。
Formatter
formatter/default.nix 映射为每个目标架构的 formatter.<system>:
# formatter/default.nix
{ nixfmt }:
nixfmt之后可运行:
nix fmtformatter 与 packages、checks 等使用同一套 nixpkgs.config 和 overlays。
Deploy
deploy/default.nix 直接映射为顶层 deploy,可返回 deploy-rs 所需配置:
# deploy/default.nix
{ self, ... }:
{
nodes = { };
}部署工具本身仍由用户通过 flake input 引入,框架只负责输出约定与自动发现。
禁用自动发现的 output
outputs.disabled 在调用 output 文件前过滤条目,适合临时关闭损坏或昂贵的 check:
inputs.snowveil.lib.mkFlake {
inherit inputs;
outputs.disabled = [
"checks.eval-nixos-desktop"
"checks.aarch64-linux.only-broken-there"
"packages.some-package"
"apps.debug"
"formatter"
"deploy"
];
}无 system 的标识会在所有架构禁用;<kind>.<system>.<name> 只禁用一个架构。支持的 kind 包括 packages、checks、apps、devShells、formatter 与 deploy。
也可使用分类属性集:
outputs.disabled = {
checks = [ "eval-nixos-desktop" ];
packages = [ "some-package" ];
};outputs.disabled 只控制框架自动发现的条目;outputs.extra 仍可显式添加同名 output。
Output 元数据
packages、checks、apps 与 shells 可在同目录添加 meta.nix:
# checks/expensive/meta.nix
{
enable = false;
systems = [ "x86_64-linux" ];
}meta.nix 必须直接返回属性集。目前支持:
enable:布尔值,设为false时不会调用default.nix;systems:允许生成该 output 的系统列表。
formatter 与 deploy 也可使用同目录的 meta.nix;deploy 只使用 enable。
Package 的单架构约定
推荐使用无歧义的 system-first 目录:
packages/x86_64-linux/foo/default.nix它生成 packages.x86_64-linux.foo。旧的:
packages/foo.x86_64-linux/default.nix继续兼容。若包名本身以 system 结尾,可通过元数据保留完整包名:
packages/foo.x86_64-linux/
├── default.nix
└── meta.nix{
systems = [ "x86_64-linux" ];
}此时 output 名是 packages.x86_64-linux."foo.x86_64-linux"。
nix flake check 与非标准 outputs
deploy、homeModules、images、options 等属于生态约定或框架自定义 output。不同 Nix 版本运行 nix flake check 时可能输出 unknown flake output 警告;这类警告本身不表示 derivation 失败。
推荐检查命令:
nix flake check path:. --show-trace需要检查全部配置架构时使用:
nix flake check path:. --all-systems --show-trace框架会生成标准的 checks.<system>.snowveil-discovery,记录发现到的 hosts、homes、packages 与模块 output。checks/ 下的 snowveil- 前缀由框架保留。
其他 outputs
不适合目录约定的 outputs 可使用 outputs.extra:
inputs.snowveil.lib.mkFlake {
inherit inputs;
outputs.extra = {
hydraJobs = { };
};
}