【经验分享】我如何学习写 Nix derivation

  • 为 holo-layer 添加 Python 环境

虽然 holo-layer 的 README 上说使用 pip 安装 Python 依赖库,但是我们用 的是声明式的 NixOS,像 pip 这种东西那是看不上一点,我们要用 Nix 来解决 依赖。

我们可以通过给系统加一个 Python,并对这个它使用 withPackages 增加必须 的 Python 库来解决问题。我们先尝试这个方法。

在 holo-layer 的 README 中找到其所需的 Python 依赖,是这样的: pip3 install epc sexpdata six inflect PyQt6 PyQt6-Qt6 PyQt6-sip

接下来就是上 NixOS 官网查有没有这些库的包了,查到的包名称的格式是类似 这样的:python313Packages.pyqt6,这里“313”指 Python 的 3.13 版本。最终 我们找到了除 PyQt6-Qt6 之外的其他包,我们怀疑 PyQt6-Qt6 可能被包括在 pyqt6这个包中了,所以先不管它。

然后就是往系统中添加 Python 了,我们可以直接选择非常新的 Python 3.13 版本,将如下代码加入environment.systemPackages中:

(pkgs.python313.withPackages
  ps: with ps; [
    epc
    inflect
    pyqt6
    pyqt6-sip
    sexpdata
    six
  ]
)

这里用到了 Nix 的with语句。with语句在放在列表前,作用是给列表的每 一项加上前缀,例如with pkgs; [ emacs firefox ],就是把 pkgs 作为前缀 加到 emacs 和 firefox 上,结果等于[ pkgs.emacs pkgs.firefox ]

完成所有操作之后,我们打开 Emacs,加载 holo-layer,结果发现还有报错, 缺少一个叫 Xlib 的 Python 库,好在官网能查到它的包,直接加进去,变成这 样:

(pkgs.python313.withPackages
  ps: with ps; [
    epc
    inflect
    pyqt6
    pyqt6-sip
    sexpdata
    six
    xlib
  ]
)

再次尝试,发现终于成功了,可以使用果冻光标了(喜)。

但这种方法并不优雅,我们的包应该是 standalone 的,不应该依赖系统安装的 Python 环境,下一节我们将解决这个问题。

2 个赞