首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何‘`nix built’再建一个已建的存储路径?

如何‘`nix built’再建一个已建的存储路径?
EN

Stack Overflow用户
提问于 2017-01-05 13:48:30
回答 3查看 4.3K关注 0票数 9

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

代码语言:javascript
复制
# packages.nix
with (import <nixpkgs> {});

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

然后我建造rustcSource

代码语言:javascript
复制
sudo nix-env -f package.nix -A rustcSource

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

代码语言:javascript
复制
with (import <nixpkgs> {});

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

但是,我发现nix-build没有重新计算散列并看到路径已经构建。因此,它最终没有下载子模块。

问:是零虫吗?如何“重建”或重新下载存储库?

实际上,我在其中创建了一个带fetchgit的派生,但是由于子模块没有下载,它失败了。因此,上述情况简化了我的问题。

EN

回答 3

Stack Overflow用户

发布于 2017-01-08 13:28:10

不是窃听器,这是故意的。

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

有关更多讨论,请参见https://github.com/NixOS/nix/issues/969

票数 6
EN

Stack Overflow用户

发布于 2017-01-13 23:09:30

要解决这个问题,您需要将散列更改为某个值,该值并不是nix存储中任何路径的有效散列。

对于固定输出派生(那些指定了显式散列,并且只有那些获得网络访问),如果散列已经匹配到nix存储中的路径,则nix将跳过下载,只使用现有路径。因此,稍微修改散列(使其不再匹配)就足以强制进行重新构建。

票数 4
EN

Stack Overflow用户

发布于 2017-09-15 00:54:49

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41486747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档