Open1

NixのFetchersを使ってみる

AsahiAsahi

Fetchersとは?

前提

  • Nixはパッケージのビルドを純粋関数に見立てて行う
    • 副作用は許されない
    • ビルド結果は冪等でなければならない
  • パッケージのインストールは必ずNix式の評価を介する
    • つまり、常にNixによってビルドされる
      • ただし、バイナリキャッシュの仕組みがある
  • パッケージはネットワークのないサンドボックスでビルドされる
    • ローカルのリソースしか利用できない
      • リソース(e.g. 画像)をインターネット越しにダウンロードしたい場合はどうするのか?
      • バイナリ配布のパッケージはどうやってインストールするのか?

Fetchers

  • nixpkgsに含まれるダウンロード用の関数群
    • GitHubリポジトリの/pkgs/build-supportに含まれる
      • ビルド用のユーティリティが置かれている
    • 名前がfetch*
      • fetchurlfetchgitなど色々ある

仕組み

どのfetcherも必ず引数にハッシュを指定する必要がある。

fetchurl関数の場合
fetchurl {
  url = "http://www.example.org/hello-1.0.tar.gz";
  hash = "sha256-lTeyxzJNQeMdu1IVdovNMtgn77jRIhSybLdMbTkf2Ww=";
};

fetcherはファイルをダウンロードすると、ファイルをハッシュ化してそれを引数のhashと比較し、もし異なればビルドを失敗させる。こうすることで、Nixはビルドの冪等性を保ちながらインターネットからリソースをダウンロードすることができる。