️ 什么是 Overlays?#
Overlays 是 Nixpkgs 的一个核心机制。你可以把它想象成在官方的 pkgs 上覆盖一层你自己的定义。
1. 基础语法
self: super: {
# 把 hello 包换成我的版本
hello = super.hello.override {
# 修改参数
};
}️ 常见的 Overlays 场景#
1. 修改编译选项 (Override)
有些包在编译时默认关闭了某些功能。
(self: super: {
mpv = super.mpv.override {
scripts = [ self.mpvScripts.mpris ];
};
})2. 打补丁 (overrideAttrs)
如果你手里有一个 .patch 文件:
(self: super: {
sl = super.sl.overrideAttrs (oldAttrs: {
patches = (oldAttrs.patches or []) ++ [ ./my-patch.patch ];
});
})3. 添加新包
你可以把自己的包定义在 Overlay 里,然后像 pkgs.my-app 这样引用它。
在 Flake 中集成 Overlays#
在 outputs 部分定义你的 Overlays。
{
inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
outputs = { self, nixpkgs, ... }: {
overlays.default = final: prev: {
sl = prev.sl.overrideAttrs (old: {
patches = (old.patches or []) ++ [ ./my-patch.patch ];
});
};
nixosConfigurations.workstation = nixpkgs.lib.nixosSystem {
system = "x86_64-linux";
modules = [
./configuration.nix
{ nixpkgs.overlays = [ self.overlays.default ]; }
];
};
};
}为什么要这样做?#
作为 Arch 用户,你可能习惯了去 AUR 找 PKGBUILD。在 NixOS,Overlays 就是你的“全能补丁”。你不需要重新打包,只需在现有包的基础上微调即可。
总结#
override:修改包函数的参数(通常是callPackage调用的函数参数)。overrideAttrs:修改传给mkDerivation的 derivation 属性(比如patches、postInstall),再产生新的 derivation。
final / prev 与实际构建
self: super: 是旧的变量命名习惯;更直观的是 final: prev:,分别表示叠加后的最终包集合与上一层包集合。导入 overlay 后仍需让消费者真正使用这个包集合;原始示例只定义局部 pkgs,没有接入 nixosSystem,这里已改成模块里的 nixpkgs.overlays。补丁修改要实际构建受影响的软件包,求值通过不代表 patch 可以应用。包函数的参数与版本由锁定 Nixpkgs 决定。
参考与延伸
根据技术笔记重新整理,示例使用通用名称。