如何使用 Nix 指定包/派生运行时依赖项?

2023-12-06

我正在制作一个 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(使用前将#替换为@)

如何使用 Nix 指定包/派生运行时依赖项? 的相关文章

随机推荐