NixのOverlays
nixpkgsの拡張を行う
docs
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がある
Nixの(//)演算子を四角い箱で図示している
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を上書きした時に、それに依存するものも全て上書きしようというのがモチベーション
fixについてはNixでfix関数を使ってAttribute Setsをoverrideするを参照mrsekut.icon
参考
Nix Pills 17
How to Fake Dynamic Binding in Nix
なぜ動的束縛が必要になるのかの解説
Flying Circus
具体例と悪い例
例 ref
こんな感じで、selfとsuperを引数に取る関数を定義する
この関数のことをoverlayと呼ぶ
code:nix
self: super: {
firefox = super.firefox.override { ... };
myBrowser = self.firefox;
}
親のfirefoxをoverrideしつつ、
myBrowserには、override済みのfirefoxを束縛している
この関数をoverlays = [ここ]に渡して使う #??
例
https://github.com/mozilla/nixpkgs-mozilla
https://github.com/nixos-rocm/nixos-rocm
https://github.com/garbas/nixpkgs-python
juliaを入れる例
https://qiita.com/hnakano863/items/87e5026906b65c4ce21e
https://discourse.nixos.org/t/install-dmg-onto-mac-using-nix-overlays/13432
mac(未解決)
通常
code:nix
let pkgs = import <nixplgs>
普通のnixpkgsをimportしている
overlayした
code:nix
let
moz_overlay = import (builtins.fetchTarball https://github.com/mozilla/nixpkgs-mozilla/archive/master.tar.gz);
pkgs = import <nixpkgs> {
overlays = moz_overlay ;
};
普通のnixpkgsに、nixpkgs-mozillaをoverlayしている
類似
packageOverrides
overlaysの制限版
overridePackages
#??
拡張する際もversionの固定はできるのか
具体例
nixpkgs-mozillaとかいいかもねmrsekut.icon
https://github.com/mozilla/nixpkgs-mozilla
packageOverrideとoverridePackagesを置き換える、ってそもそもこれらはなに?
いつ使うのか
patchの追加をしたい場合
https://nixos.wiki/wiki/Overlays#Adding_patches
大枠は元のやつを使いつつ、一部分だけ拡張したい場合にpatchを当てる
https://ianthehenry.com/posts/how-to-learn-nix/overlays/
https://ianthehenry.com/posts/how-to-learn-nix/overriding/
https://github.com/nix-community/todomvc-nix/blob/master/docs/Nix.md#-overlaynix-
TodoMVC-Nix