【问题标题】:How to use an experimental command in nix?如何在 nix 中使用实验性命令?
【发布时间】:2023-02-10 17:28:28
【问题描述】:

就像这个tutorial 我想看看推导。

ls /nix/store/*.drv | head -n 1 | nix show-derivation

实验性 Nix 功能“nix-command”已禁用;使用 '--extra-experimental-features nix-command' 覆盖

我重试建议的更改

ls /nix/store/*.drv | head -n 1 | nix show-derivation --extra-experimental-features nix-command

错误:在“/mnt”处遇到文件系统边界之前无法找到薄片

【问题讨论】:

  • 你运行的是哪个版本的 nix?您是否在配置文件中启用了 flakes 功能,例如 /etc/nix/nix.conf(例如通过 configuration.nix)或 ~/.config/nix/nix.conf?你可以通过nix show-config | grep experimental查询。
  • 我已经打开了一个问题来改进这个github.com/NixOS/nix/issues/7475

标签: nix


【解决方案1】:

nix show-derivation 期望其输入作为命令行参数。

缺少任何输入,它似乎默认查找薄片。

如果不是因为 *.drv 在我的商店中产生太多结果,这会起作用:

$ nix show-derivation --extra-experimental-features nix-command $(ls /nix/store/*.drv | head -n 1)
bash: /run/current-system/sw/bin/ls: Argument list too long

如果你有任何 .drv 文件,这有效:

$ nix show-derivation --extra-experimental-features nix-command $(find /nix/store -maxdepth 1 -name '*.drv' | head -n 1)

没有任何 .drv 文件,$(...) 不产生任何参数,这将是获取错误消息的另一种方式。

【讨论】:

  • 不要像ls那样使用find。使用 -exec primary 来执行 nix 而不是:find /nix/store -name '*.drv' -exec nix show-derivation --extra-experimental-features nix-command {} +
  • 不要忘记head -n 1!您的命令将为所有.drvs 运行nix。我很确定 ls 部分是为了说明,但如果你真的想这样做,请输入 xargs 以批处理调用并使其更快;)
  • 我宁愿避免使用 head,原因与我避免阅读 lsfind 的原因相同:文件名可以包含换行符。是的,您可能可以依赖.drv 文件 *不是包括新行,我怀疑 Nix 中还有其他地方无论如何都采用单行文件名。 GNU find 至少提供了一个 -quit primary,它会导致 find-exec 完成它的工作后立即停止查找文件。 (find ... -exec ... + -quit)。
  • 好吧,chepner,你今天赢得了互联网。 Chep... - 起首!
【解决方案2】:

为了永久有效,将以下行添加到您的配置文件“~/.config/nix/nix.conf

experimental-features = nix-command

如果 conf 文件不存在,请创建它。您可以附加其他实验性特征,如薄片等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 2016-08-24
    • 1970-01-01
    相关资源
    最近更新 更多