Hacker News 中文摘要

RSS订阅

尼克斯派生疯狂 -- Nix Derivation Madness

文章摘要

作者在使用Nix包管理器时遇到一个困惑问题:虽然成功安装了Ruby解释器,但无法找到对应的构建文件(derivation),尝试从NixOS缓存重新获取也失败了。这挑战了他对Nix工作原理的基本理解。

文章总结

标题:Nix派生机制的困惑与发现

作者在探索Nix包管理系统时,遇到了一个令人费解的问题:虽然成功安装了Ruby解释器,但无法找到对应的派生文件(.drv)。通过一系列实验和验证,作者揭示了Nix中固定输出派生(Fixed-Output Derivations,FOD)的独特行为及其对依赖关系的影响。

核心发现: 1. 派生文件缺失之谜:即使Ruby二进制文件存在,对应的派生文件却无法找到,且无法从NixOS缓存中恢复。

  1. 固定输出派生的特性:
  • 修改FOD的派生内容(如添加无关属性)会生成新的派生路径,但输出路径保持不变
  • 依赖FOD的派生也会因此生成新的派生路径,但输出路径同样不变
  • 这导致Nixpkgs中可能出现派生路径与输出路径脱节的情况
  1. 更奇特的现象:
  • 一个输出路径可能对应多个不同的派生
  • 通过修改派生文件(如移除某些输入)仍能得到相同的输出
  • 展示了Nix派生机制的"一对多"特性

技术验证过程: 作者通过创建自定义的FOD和依赖FOD的派生,逐步验证了这些现象。实验显示,即使修改FOD内容或删除派生中的某些输入依赖,只要最终输出内容不变,输出路径就保持一致。

结论: Nix的派生机制远比表面看起来复杂,特别是涉及固定输出派生时。这种机制虽然保证了构建的确定性,但也带来了派生路径与输出路径之间关系的复杂性。作者将这些发现比作"通往Nix启蒙之路上充满陷阱的旅程",强调了深入理解Nix内部机制的重要性。

(注:原文中的具体命令行操作和哈希值等细节被适当保留以说明技术要点,但与核心论证无关的冗余细节已做删减)

评论总结

评论总结:

  1. 关于Ca-derivations的改进:

    • 观点:Ca-derivations将修复当前问题,使异常情况变为可预期和正确处理的情况
    • 引用:"upcoming Ca-derivations will fix this by making these situations expected, properly-handled cases"
    • 引用:"https://nixos.wiki/wiki/Ca-derivations"
  2. 关于deriver字段的问题:

    • 观点:deriver字段设计存在缺陷,无法真正追踪Nix表达式的来源
    • 引用:"The deriver field in Nix has always been a misfeature"
    • 引用:"it just causes a lot of confusion when the deriver recorded in the binary cache doesn't match the local evaluation result"
  3. 关于存储路径命名:

    • 观点:当前命名方式不友好,建议改进可读性
    • 引用:"are ugly names so common, why not start with ruby-3.3.9"
    • 引用:"so any list of files is semantically sorted/readable"
  4. 关于Nix的未来发展:

    • 观点:需要从根本上重写Nix系统
    • 引用:"Nix was a great research project. Now is the time to rewrite it from the ground up"
    • 观点:期待更好的来源追踪机制
    • 引用:"Nix will hopefully gain proper provenance tracking"
    • 引用:"https://github.com/NixOS/nix/pull/11749"
  5. 对Farid文章的认可:

    • 观点:赞同Farid对deriver不匹配问题的分析
    • 引用:"+1 to Farid, great write-up!"
    • 引用:"What you're seeing is the long-standing 'deriver' mismatch"