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进行了某种预构建步骤,但是如果在那儿我看不到它。
谢谢,
这并不是答案,但如果我将其发布在评论部分,它的格式会很丑陋。
我也不确定这个黑客是否是完成这项工作的正确方法。
我注意到如果我使用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是否必须这样做,它应该是相同的路径。
| 归档时间: |
|
| 查看次数: |
411 次 |
| 最近记录: |