Oliver Charles の「How I Develop with Nix」という記事を読みました。現在、私も Haskell 開発に Nix を使用したいと考えています。ただし、私を少し困惑させたのは、ローカルの nix ビルド スクリプトの説明です。
{ haskellPackages ? (import <nixpkgs> {}).haskellPackages }:
let
inherit (haskellPackages) cabal cabalInstall_1_18_0_2
text mtl transformers; # Haskell dependencies here
in cabal.mkDerivation (self: {
pname = "project-name";
version = "1.0.0";
src = ./.;
buildDepends = [
# As imported above
text mtl transformers
];
buildTools = [ cabalInstall_1_18_0_2 ];
enableSplitObjs = false;
})
(出典:上記引用記事)
私が間違っていなければ、Nix は、関数に渡された属性セットからハッシュを導出することにより、バイナリ置換のような保証を行います。ただし、この場合、src 属性に関連付けられたバージョン管理はありません。したがって、コードをローカルで変更すると、異なるコンパイル結果が同じハッシュに関連付けられることになると思います。それは Nix の保証を破ることにはなりませんか? Nix は、ファイル システムの変更を検出できるほど (たとえば、タイムスタンプを調べて) 賢いのでしょうか?