【问题标题】:Stack build without storing output in nix store?堆栈构建而不将输出存储在nix存储中?
【发布时间】:2019-03-31 17:52:00
【问题描述】:

我在一个项目上多次运行stack build - 每次似乎都将结果保存在/nix/store 中,随着时间的推移需要大量存储空间。

有没有办法不能将结果保存到商店?

【问题讨论】:

    标签: haskell-stack nix


    【解决方案1】:

    不,您不能“不将结果保存到商店”。 (您可以指定一个不同的商店,但这会使您的问题变得更糟——您将在此商店中存储一个额外的依赖链副本,而且您将无法下载由 Nix 的自动化上游构建系统 Hydra 构建的部分依赖链的预构建二进制文件。

    应该做的是垃圾收集你的商店,这将删除不再使用的项目(通过活动“gc root”的可达性来衡量 - 例如@987654321 @由构建过程创建的链接、正在运行的程序或安装在用户配置文件中的软件集nix-env)。

    这可以很简单:

    nix-store --gc
    

    ...或者,如果您有一个特定的项目占用了您想要移除的空间:

    # delete all instances of whatever, if-and-only-if they aren't reachable from a gc root
    nix-store --delete /nix/store/*-whatever
    

    【讨论】:

    • 为什么不可能? nix 的工作方式在技术上是不可行的 - 或者只是堆栈不支持的东西?
    • 前者。请记住,Nix 的主要设计目标之一是让构建产品完全可重现,仅从其派生中的变量派生。从这些输入的哈希派生的 Nix 存储中的目的地被提供给构建器;如果它安装在该位置之外,则不能保证它可以正常工作(因为允许构建步骤将完全限定的路径硬编码到同一包的其他部分,如在包装脚本中)。
    • 我想如果你知道一个特定的构建不是自引用的,你可以告诉 Nix 构建它(在商店中),复制出来,然后使用nix-store 删除店内副本...但这破坏了许多其他 Nix 功能(将不再跟踪对该包的其他派生的引用,因此您不知道您的代码 依赖的东西on 不会被垃圾收集;任何未来构建依赖它的东西的尝试都无法访问单个知名的规范副本;等等)。
    • (另外,如果商店里没有东西,nix-diffnix-copy-closure 等工具将无法使用)
    猜你喜欢
    • 2018-10-29
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    • 2020-07-23
    相关资源
    最近更新 更多