experimental-features = nix-command flakes

2021-11-11: flake.nixの更新

git repositoryに含まれないflake.nixは

nix build ./#

でbuildを試せる。 errorが出るのをわかっていてわざわざcommitして結果を試してみる必要はないのでflakesに大量のコミットログを残さなくて済むはずだ。

ただ、おかしなことにこの状態だとsha256の不一致エラーが出ない。 その確認がこのステップの目的なんだけど。

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になる。

2021-11-09: 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。

githubにリポジトリを作って自分の環境を構築する(2021-11-06-2)

これでどうだ。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};
        };
      }
    );
}

ちゃんと理解して複数のflake.nixをまとめ上げて自分の環境を構築する(2021-11-06)

これ見て(さらに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が更新されてしまう。

非常に浅い理解でflake.nixを作って自分のパッケージをインストールする(2021-11-05)

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";

2021-11-06

だんだんわかってきたので箇条書きに変更した。

パッケージの更新

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を移行すればいいのだろう。 nixnix_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とは比べ物にならない。

なんか成熟感と新鮮さが同時にやってきた。