3

我已阅读 Oliver Charles 的文章,标题为“我如何使用 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 是否足够聪明以检测文件系统的更改(例如通过查看时间戳)?

4

1 回答 1

4

每次调用 nix-shell 时,它都会计算 src 中当前内容的哈希值,如果不存在,则将其复制到哈希名称下的 nix 存储中。所以改变的 src 内容最终会导致一个新的哈希。这适用于派生属性集中的所有路径;它们都被复制到 nix 商店。

当然,当您进行正确安装时,也会发生同样的事情。

于 2014-09-09T19:48:41.323 回答