【发布时间】:2021-09-20 13:14:19
【问题描述】:
我正在制作一个 haskell 程序,我正在设置 buildInput 像这样包含 pkgs.ffmpeg-full:
(myHaskellPackages.callCabal2nix "App" (./.) {}).overrideAttrs (oldAttrs: {
buildInputs = (oldAttrs.buildInputs or []) ++ [ pkgs.ffmpeg-full ];
})
然而,这似乎使得 ffmpeg 包只能在构建时访问,而不是在应用程序的运行时访问。
我需要设置什么属性才能使ffmpeg-full 在运行时可用 - 能够调用ffmpeg 可执行文件?
nix 丸中有一个关于运行时依赖的部分,但我不明白那个部分,它如何总是通过哈希来确定运行时依赖是没有意义的?我的意思是,如果我在 shell 脚本中引用可执行文件 - nix 肯定不会解析 shell 脚本来确定我引用的可执行文件。 https://nixos.org/guides/nix-pills/automatic-runtime-dependencies.html#idm140737320205792
但是,运行时依赖项有些不同。建造 Nix 自动识别依赖项 任何派生调用,但我们从不指定什么是运行时 派生的依赖项。
确实涉及到黑魔法。起初是这样的 一瞥让你觉得“不,这不能长期工作”,但在 同时它运行良好,以至于构建了一个完整的操作系统 在这个魔法之上。
换句话说,Nix 会自动计算所有运行时 派生的依赖关系,这可能要归功于 商店路径。
【问题讨论】:
-
是的,nix 确实会扫描您的输出以查找哈希值。如前所述,它工作得非常好。我从来没有遇到过任何问题。
-
"要让 ffmpeg-full 在运行时可用吗?"您需要什么取决于您是链接到它还是调用可执行文件。
-
在这种情况下,它正在调用一个可执行文件。
-
我可以要求一个可运行的minimal reproducible example吗?在 Cabal 构建中使用 nixpkgs
makeWrapper有一些 Haskell 特有的复杂性。
标签: nix