git repositoryに含まれないflake.nixは
nix build ./#
でbuildを試せる。 errorが出るのをわかっていてわざわざcommitして結果を試してみる必要はないのでflakesに大量のコミットログを残さなくて済むはずだ。
ただ、おかしなことにこの状態だとsha256の不一致エラーが出ない。 その確認がこのステップの目的なんだけど。
ということで調べた。例えば、
# flakes/kissat/flake.nix
src = fetchFromGitHub {
owner = "arminbiere";
repo = "kissat";
rev = "abfa45fb782fa3b7c6e2eb6b939febe74d7270b7";
sha256 = "06pbmkjxgf2idhsrd1yzvbxr2wf8l06pjb38bzbygm6n9ami89b8";
};
からダウンロードされるものは、
https:/github.com/${owenr}/${repo}/archive/${rev}.tar.gz
これをnix-prefetch-url
に渡す。
$ nix-prefetch-url --type sha256 --unpack https:/github.com/arminbiere/kissat/archive/abfa45fb782fa3b7c6e2eb6b939febe74d7270b7.tar.gz
path is '/nix/store/2nb50j4lv4ab9waps7awqbwg1x1fvljn-abfa45fb782fa3b7c6e2eb6b939febe74d7270b7.tar.gz'
06pbmkjxgf2idhsrd1yzvbxr2wf8l06pjb38bzbygm6n9ami89b8
$
これがsha256
になる。
nix profile install nixpkgs/nixpkgs-unstable#nix_2_4
できない件いや、別にuser profileから消えてもSSDから消えるわけではないので、ビクビクせずに、
/nix/var/nix/profiles/per-user/nash/profile-XX-link/bin/nix profile remove nix
/nix/var/nix/profiles/per-user/nash/profile-XX-link/bin/nix profile install nixpkgs/nixpkgs-unstable#nix_2_4
すればいいだけだった。
これで残ったのはcacertだけ。 これを消すと新しいパッケージの認証に失敗して何もインストールできなくなるのではと思っていたのが、やってみたたらできた。 ただし、一回conflict起こさせておくことが必要。つまりダウンロードしてlocal storeに展開までしておけば認証が終わっているということなので、それ以降cacertは要らない。
さようなら、channels。ようこそ、experimental nix-command and flakes。
これでどうだ。upgradeで更新しなくなったぞ。
#github:shnarazk/flakes/flake.nix
{
description = "Piling up my flakes";
inputs = {
flake-utils.url = github:numtide/flake-utils;
emacs-head.url = github:shnarazk/flakes?dir=emacs-head;
kissat.url = github:shnarazk/flakes?dir=kissat;
};
outputs = { self, flake-utils, emacs-head, kissat }:
flake-utils.lib.eachDefaultSystem (system:
{
packages = {
emacs-head = emacs-head.defaultPackage.${system};
kissat = kissat.defaultPackage.${system};
};
}
);
}
これ見て(さらに2時間奮闘して)理解した。
こういうことだ。なるほど、これはほぼflakesの合成をやっているだけだ。 さらに1時間bug fixに苦戦して結局こういうことになった。
# flake.nix
{
description = "Piling up my flakes";
inputs.nixpkgs.url = github:NixOS/nixpkgs/nixpkgs-unstable;
inputs.flake-utils.url = github:numtide/flake-utils;
inputs.emacs-head.url = "./emacs-head";
inputs.kissat.url = "./kissat";
outputs = { self, nixpkgs, flake-utils, emacs-head, kissat }:
flake-utils.lib.eachDefaultSystem (system:
{
packages = {
emacs-head = emacs-head.defaultPackage.${system};
kissat = kissat.defaultPackage.${system};
};
}
);
}
「それはderivationじゃないエラー」を修正し、全systemに対応していったら、1時間前のバージョンととも全然違うものになってしまった。うーむ正解なのか? flakesの階層合成はどこかに説明されてないのか。
{ a: {x: ka, y: la, z: ma}, b: {x: kb, y: lb, z: mb}, c: {x: kc, y: lc, z: mc} }
=>
{ x: {a: ka, b: kb, c: kc}, y: {a: la, b: lb, c: lc}, z: {a: ma, b: mb, c: mc} }
flake-utilsにはない、Optics的な何か。
いや、まだダメだわ。二つのフレークが共有してはいけないものまで共有していて、flake.lockのupdateが止まらない。 nix profile upgrade
でも毎回inputが更新されてしまう。
nix build
nix profile install result/
一方、channelに対するoverlayはなくなった(はず)なので、さて勝手に最新バージョンをbuildするにはどうしたものか。
例えば、emacs27に対するoverlayだったemacs-headは以下のようにしてemacs28というattributeを注入していた。
# emacs-head.nix
self: super: {
emacs28 = super.emacs.overrideAttrs (attrs: rec {
pname = "emacs-head";
name = "emacs-head-${version}";
version = "28.0.60";
flakeにするとderivationを一つ返すファイルflake.nixが必要になる。 ここが浅い理解。それではnixpkgs/flake.nixが理解できないではないか。 なのでemacs28が追加された集合を作るのでははなく、できたderivationをそのまま返せばいい(defaultPackage.${system}
に代入している)。
# flake.nix
{
description = "Emacs Head, the unreleased 28.0";
inputs.nixpkgs.url = github:NixOS/nixpkgs/nixpkgs-unstable;
inputs.flake-utils.url = github:numtide/flake-utils;
outputs = { self, nixpkgs, flake-utils }:
flake-utils.lib.eachDefaultSystem (system: {
defaultPackage =
with import nixpkgs { system = "x86_64-darwin"; };
emacs27.overrideAttrs (attrs: rec {
name = "emacs-head-${version}";
pname = "emacs-head";
version = "28.0.60";
nix profile install
でのインストールがうまくいかない。そのためにはできたderivationをnixpkgs.defaultPackeges
またはlegacyPackages
に注入しないといけないのだが、見ればわかるようにやってない。それはflake.nixではなくdefault.nixだかshell.nixの仕事のような気がする。nix build & nix install result/
はうまくいく。だんだんわかってきたので箇条書きに変更した。
nix profile upgrade '.*'
flakeはTTLが切れたら勝手に更新してくれる。
ただし、こうしたいならchannelからではなくflakeからパッケージをインストールしなければならない。 以下はnixpkgs-unstable channelからnixpkgs/nixpkgs-unstable registryへ引越しの途中の状態。
0 - - /nix/store/l1nnjj26j4nfggzfdp25d5074m35xrwa-parallel-20210722
4 - - /nix/store/6kaig6yyxm6mfha5b21x827dkfazb0cg-ispell-3.4.04
7 - - /nix/store/ghshklfk3q98cikad1wf8b0rpwhmp1iz-tmux-3.2a
8 - - /nix/store/475pa4h5rd6289zm8iga507ppl3k9zwn-nix-2.4pre-rc1
5 - - /nix/store/wiqcjg66s7sb6cais8pifrk3l9cpkrmq-nss-cacert-3.66
7 flake:nixpkgs/nixpkgs-unstable#legacyPackages.x86_64-darwin.tmux github:NixOS/nixpkgs/7053541084bf5ce2921ef307e5585d39d7ba8b3f#legacyPackages.x86_64-darwin.tmux /nix/store/ghshklfk3q98cikad1wf8b0rpwhmp1iz-tmux-3.2a
11 flake:nixpkgs/nixpkgs-unstable#legacyPackages.x86_64-darwin.ispell github:NixOS/nixpkgs/7053541084bf5ce2921ef307e5585d39d7ba8b3f#legacyPackages.x86_64-darwin.ispell /nix/store/6kaig6yyxm6mfha5b21x827dkfazb0cg-ispell-3.4.04
14 flake:nixpkgs/nixpkgs-unstable#legacyPackages.x86_64-darwin.parallel github:NixOS/nixpkgs/7053541084bf5ce2921ef307e5585d39d7ba8b3f#legacyPackages.x86_64-darwin.parallel /nix/store/l1nnjj26j4nfggzfdp25d5074m35xrwa-parallel-20210722
この状態からどうやってnixを移行すればいいのだろう。 nix
とnix_2_4
とが同じ優先度を持っているのでそれを設定して上書き可能な状態にしなければいけないことはわかった。 しかし既にnix-envが使えない状況でどのコマンドを使えばそれができるのだろう。
issue立っているのでどうもできないようだ。ワハハ。
nix profile list
で通し番号を調べてnix profile remove
で指定。
nix profile wipe-history --older-than 7d
nix search nixpkgs package-name
nix search nixpkgs/nixpkgs-unstable package-name # only a specified branch
flakeはキャッシュされるのでnix-env -qa
とは比べ物にならない。
なんか成熟感と新鮮さが同時にやってきた。