如何在Nix上从Haskell在Nix上调用可执行文件

use*_*536 5 executable haskell nixos nix

我希望编写一些Haskell,它将Haskell作为其工作的一部分。并将其安装在nixOS主机上。我不想将可执行文件放在我的PATH中(并且依赖于它会破坏nix的美观依赖模型)。

例如,如果这是一个Perl脚本,我将拥有一个简单的构建器,该构建器将根据.nix文件中声明的依赖关系查找某种格式的字符串,并将其替换为可执行文件名称。但这对于haskell常见的基于阴谋的建筑似乎有些困难。

在nix上的Haskell代码中,是否存在用于在构建时(包括在开发期间以及在安装时)对可执行文件的路径进行编码的标准用法?

为了举一个具体的例子,下面是一个简单的“脚本”:

import System.Process ( readProcess )

main = do
  stdout <- readProcess "hostname" [] ""
  putStrLn $ "Hostname: " ++ stdout
Run Code Online (Sandbox Code Playgroud)

我希望能够编译该程序(原则上)而不依赖于PATH中的主机名,而是用完整的/ nix / store / -inetutils- / bin / hostname路径替换主机名,从而也能获得收益nix下的依赖管理。

这可以通过使用shell(或类似的)脚本来管理,该脚本使用如上定义的替换方案构建,该脚本设置haskell可执行文件期望的环境。但是仍然需要通过cabal.mkDerivation进行一些引导,并且由于我是OptParse-Applicative的bash完成的爱好者,所以我不愿意通过每次按下Tab键启动另一个脚本来降低它的速度。但是,如果需要的话,就足够公平了。

我确实通过cabal.mkDerivation进行了某种预构建步骤,但是如果在那儿我看不到它。

谢谢,

wiz*_*zup 0

这并不是答案,但如果我将其发布在评论部分,它的格式会很丑陋。

我也不确定这个黑客是否是完成这项工作的正确方法。

我注意到如果我使用nix-shell我可以获得 nix 商店的完整路径

假设哈希值始终相同,据我所知,您可以使用它在构建配方中进行硬编码。

$ which bash
/run/current-system/sw/bin/bash
[wizzup@ ~] 
$ nix-shell -p bash

[nix-shell:~]$ which bash
/nix/store/wb34dgkpmnssjkq7yj4qbjqxpnapq0lw-bash-4.4-p12/bin/bash
Run Code Online (Sandbox Code Playgroud)

最后,我怀疑如果您使用buildInput是否必须这样做,它应该是相同的路径。