【问题标题】:How to `nix-build` again a built store path?如何再次“nix-build”构建存储路径?
【发布时间】:2017-05-20 02:20:18
【问题描述】:

我创建自己的存储库来获取一些 git 源代码。

# packages.nix
with (import <nixpkgs> {});

rec {
  rustcSource = fetchgit {
    url = https://github.com/rust-lang/rust;
    rev = "3191fbae9da539442351f883bdabcad0d72efcb6";
    sha256 = "0w1l14kz9kxyj5dw3w9xxk1fzww5xqs3sf8saay0mh7nkmvrdb59";
  };
}

然后我构建rustcSource

sudo nix-env -f package.nix -A rustcSource

它显示了/nix/store/096fpy9qjbz5r14aadjnq9d2md9ql9cg-rust-3191fba 的存储路径。问题是,我忘了下载它的子模块,所以我改变我的表达方式来包含子模块,

with (import <nixpkgs> {});

rec {
  rustcSource = fetchgit {
    url = https://github.com/rust-lang/rust;
    rev = "3191fbae9da539442351f883bdabcad0d72efcb6";
    sha256 = "0w1l14kz9kxyj5dw3w9xxk1fzww5xqs3sf8saay0mh7nkmvrdb59";
    leaveDotGit = true;
    fetchSubmodules = true;
  };
}

但是,我发现nix-build 并没有重新计算哈希值并看到路径已经建立。因此,它最终不会下载子模块。

问:是 nix 错误吗?如何“重建”或重新下载存储库?

附:实际上我在其中创建了一个带有 fetchgit 的派生,但它失败了,因为没有下载子模块。所以,上面的案例简化了我的问题。

【问题讨论】:

    标签: nix nixos


    【解决方案1】:

    不是错误,这是设计使然。

    指定散列的派生称为固定输出派生,它们仅检查散列是否与存储中的任何现有派生匹配并使用它。因此,您的 fetchSubmodules 更改将被忽略。

    更多讨论见https://github.com/NixOS/nix/issues/969

    【讨论】:

    • 感谢您的回答!有关如何解决此问题的详细说明? (所以我可以使用 fetchSubmodules 设置为 true 进行重建)
    • 将哈希值更改为随机值,nix 会向您报告正确的哈希值。
    • 随机值或只是更改一个字母不起作用,但clacke's comment still works:将哈希更改为 52 个零。
    【解决方案2】:

    要解决此问题,您需要将哈希更改为某个值,该值还不是您的 nix 存储中任何路径的有效哈希。

    对于固定输出派生(那些指定了显式哈希并且只有那些获得网络访问权限的派生),如果哈希已经与 nix 存储中的路径匹配,则 nix 将跳过下载并仅使用现有的小路。所以稍微改变哈希(使其不再匹配)应该足以强制重建。

    【讨论】:

    • 感谢您的回答@bennofs!我实际上并没有指定不更改哈希。但实际上,我尝试下载rustc 的稳定版本。所以,改变哈希意味着改变版本/稳定性..
    【解决方案3】:

    获取子模块将导致具有不同哈希的包。解决此问题的最简单方法是将哈希更改为无效值并重建包。错误消息将包含正确的哈希。使用它并重建。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-15
      • 2010-10-25
      相关资源
      最近更新 更多