我读过Oliver Charles'标题为"How I Develop with Nix"的文章。现在我也想将Nix用于我的Haskell开发。 然而,令我困惑的一件事是本地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;
})
(资料来源:The article cited above)
如果我没有弄错的话,Nix通过从传递给函数的属性集中派生哈希来保证二进制替换。 但是,在这种情况下,没有与src属性关联的版本控制。因此,我认为在本地修改我的代码意味着不同的编译结果与相同的哈希相关联。这不会打破尼克斯的保证吗? Nix是否足够聪明地检测文件系统的变化(例如通过查看时间戳)?
答案 0 :(得分:4)
每次调用nix-shell时,它都会计算当前src中的whats的哈希值 如果它还不存在,则将其复制到散列名下的nix存储区。所以 更改src内容最终会导致新的哈希。所有路径都是如此 在派生属性集中;它们都被复制到nix商店。
当然,当你进行适当的安装时会发生同样的事情。