NixのOverlays
overlayは関数
2つの引数を取る
self
super
返り値は、overrideしたpackage set
selfとsuperについて
self
自身のpackage sets
自身の別の項に依存するのでちょっとややこしいmrsekut.icon
super
親であるpackage sets
これを拡張したいためにoverlaysを使っている
こちらはimmutableなので別に何も難しくないmrsekut.icon
https://gyazo.com/cfc4f9e5756014c2ca33af9bc8731a11 https://nixos.wiki/wiki/Overlays
mainというpackage setがあり、それを2段階で拡張したext-1とext-2がある
x // yと書く時、
左から来る矢印がx
上から来る矢印がy
selfは、常に同じ値を参照している
superは、拡張元のpackage setsを参照している
だから、例えば、self.fooとsuper.fooは異なる値になる
Overlaysのself(のややこしさ)のモチベーション
直感的には、こんな感じのpackage setがある時に、
code:nix
pkgs = self: { a = 100; b = self.a+200; }
aをoverrideして使いたいとする
ここで、bの値はaに依存していることに注意する
この時に、
ただ単にfix pkgs // { a = 2; }と書いただけでは
{ a = 1; b = 300; }になってしまう
aの値は確かに上書きできているが、aに依存している箇所が元のままになっている
aが上書きされたのなら、bも上書きされないと依存関係がおかしくなるので困る
特定のfieldを上書きした時に、それに依存するものも全て上書きしようというのがモチベーション
参考
なぜ動的束縛が必要になるのかの解説
具体例と悪い例
こんな感じで、selfとsuperを引数に取る関数を定義する
この関数のことをoverlayと呼ぶ
code:nix
self: super: {
firefox = super.firefox.override { ... };
myBrowser = self.firefox;
}
親のfirefoxをoverrideしつつ、
myBrowserには、override済みのfirefoxを束縛している
この関数をoverlays = [ここ]に渡して使う #?? 例
juliaを入れる例
mac(未解決)
通常
code:nix
let pkgs = import <nixplgs>
overlayした
code:nix
let
pkgs = import <nixpkgs> {
};
類似
packageOverrides
overlaysの制限版
overridePackages
拡張する際もversionの固定はできるのか
具体例
いつ使うのか
patchの追加をしたい場合
大枠は元のやつを使いつつ、一部分だけ拡張したい場合にpatchを当てる