我正在制作一个 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-dependency.html#idm140737320205792
然而,运行时依赖性有些不同。建造
一旦使用依赖项,Nix 就会自动识别它们
任何派生调用,但我们从不指定运行时是什么
推导的依赖关系。
这确实涉及黑魔法。这是一开始的事情
乍一看会让你觉得“不,这从长远来看是行不通的”,但在
同时它运行得非常好,以至于构建了一个完整的操作系统
在这个魔法之上。
换句话说,Nix 自动计算所有的运行时间
派生的依赖关系,这可能要归功于以下哈希值
商店路径。
默认.nix:
{
ghc ? "ghc8106",
pkgs ? import <nixpkgs> {}
}:
with pkgs.haskell.lib;
let
haskellPkgs = pkgs.haskell.packages.${ghc};
inherit (pkgs) lib;
mySourceRegexes = [
"^app.*$"
"^.*\\.cabal$"
"package.yaml"
];
myApp = (haskellPkgs.callCabal2nix "my-hello"
(lib.sourceByRegex ./. mySourceRegexes) { });
in myApp
.overrideAttrs(
oa: {
nativeBuildInputs = oa.nativeBuildInputs ++ [pkgs.hello pkgs.makeWrapper];
installPhase = oa.installPhase + ''
ln -s ${pkgs.hello.out}/bin/hello $out/bin/hello
'';
postFixup = ''
wrapProgram $out/bin/x-exe --prefix PATH : ${pkgs.lib.makeBinPath [ pkgs.hello ]}
'';
})
src/Main.hs:
module Main where
import System.Process (callCommand)
main :: IO ()
main = do
putStrLn "HELLO"
callCommand "hello"
putStrLn "BYE"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)