NixのFetcher
この辺を読むと良さそう
NixのビルドシステムにはFetcherという脱出口的な機能があります。これは再現性を損わずにインターネットからリソースを取得するための仕組みです。Fetcherはダウンロード前にダウンロード予定のリソースのハッシュ値を指定しておく必要があります。ビルド実行時、Fetcher経由で取得したリソースから算出したハッシュと事前に指定したハッシュが異なる場合、即座にビルドを失敗させるという仕組みです。
多分こんな感じの流れ
いったんnixpkgsのことは忘れる
remoteにあるhttp://example/hoge-12.tar.gzを使いたい
この際にも再現性を担保するために、ただURLを見ればよいのか、hashを見る必要があるのかなどが異なる
remoteの種類によって、どこを参照すれば一意に特定できるのかが異なる
例えば、GitHubならrepository名やgit commitのhashを見れば一意に特定できる
正確には4つの引数がいるmrsekut.icon
このようにremoteのものを特定してfetchしてくる際に、fetcherを使う
primitiveなfetcherは2種類(3種類?)で、それ以外は個別のサービスに対してwrapされた便利関数のようなもの
例えば、SVNにはそれ用の、GitHubにはそれ用のfetcherが用意されている
だからfetcherHogeのような名前の関数がいっぱいある
引数の個数などは異なるが、考え方としては同じ
これはnixpkgs自体のversionを固定するためにも使われる
fetcherを使う時に引数でhashを渡さないといけないものもあるが、このhashを計算するのがめんどい
そこで便利なコマンドしてnix-prefetch-hogeのようなものが各fetcherに対して(?)用意されている
これを使うと簡単にhashを計算できる
という感じだろうかmrsekut.icon
え、ややこしすぎる?mrsekut.icon
fetchurlという関数、2種類あるのかmrsekut.icon
builtin関数としてのものと、primitive fetcerとしてのもの
前者はNix言語で、校舎はC++で定義されている
builtin関数のものは評価中にdownloadする
前者
後者
これは?
普通に使う分にはbuiltinの方だけを意識してたら良いと思うので、後者の方はもう少し知識が増えるまで、理解することを保留しよう..mrsekut.icon
階層にするとこんな感じ
fetcher
primitiveなやつ
wrapされた便利関数
fetchGit
fetchGitHub
fetchTarball
etc.
primitiveなfetcher
fetchurl
urlで指定しているcontentsをそのままstoreに保存する
これがtar.gzのようなアーカイブファイルだとしても解凍せずにそのまま保存する
fetchzip
urlの指定先はアーカイブファイルである必要がある
e.g. url = "http://www.example.org/hello.tar.gz";
urlで指定しているcontentsを解凍してからstoreに保存する
zipという名前が付いているが、zipに限らず任意のアーカイブファイルに対して使える
C++かなにかで実装されている
2つの引数を取る
url
hash
sha256など
code:nix
{ stdenv, fetchurl }:
stdenv.mkDerivation {
name = "hello";
src = fetchurl {
sha256 = "1111111111111111111111111111111111111111111111111111";
};
}
fetchpatch
builtin関数
GitHub利用者はたいていこれを使う感じじゃないかなmrsekut.icon
内部でfetchzipやfetchGitを使うので、そのwrapperと捉えて良いと思う
11.1. fetchsvn
11.3. fetchfossil
11.4. fetchcvs
11.5. fetchhg
11.7. fetchFromGitLab
11.8. fetchFromGitiles
11.9. fetchFromBitbucket
11.10. fetchFromSavannah
11.11. fetchFromRepoOrCz
11.12. fetchFromSourcehut
etc.
他にもめちゃくちゃある
これらはコマンド
これは外部ライブラリ
update時にhashを書き換えるのだるい問題
versionを上げる時にhashを調べて書き換えないといけないのでだるい
その解決策も色々出てきている
色々出てきすぎて調べるのが大変mrsekut.icon
nixpkgsに対しての解決策
コマンド一発でhashを書き換えられるらしい
usecases