gpt4 book ai didi

haskell - 如何使用 Nix 替换源代码中不在 PATH 中的可执行文件的路径

转载 作者:行者123 更新时间:2023-12-02 04:06:26 26 4
gpt4 key购买 nike

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

如果这是一个 Perl 脚本,我将有一个简单的构建器来查找特定格式的字符串,并根据 .nix 文件中声明的依赖项将它们替换为可执行文件名称。但对于 haskell 常见的基于 cabal 的构建来说,这似乎有点困难。

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

为了举一个具体的例子,这里有一个简单的“脚本”:

import System.Process ( readProcess )

main = do
stdout <- readProcess "hostname" [] ""
putStrLn $ "Hostname: " ++ stdout

我希望能够编译运行这个(原则上)而不依赖于路径中的主机名,而是用完整的/nix/store/-inetutils-/bin/hostname 路径替换主机名,因此也获得 nix 下依赖管理的好处。

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

我确实通过 cabal.mkDerivation 查看了某种预构建步骤,但如果它在那里,我没有看到它。

谢谢

最佳答案

假设您正在 Nix 中构建 Haskell 应用程序,您可以通过 Nix 表达式修补配置文件。有关如何执行此操作的示例,请查看 this small project .

关键是你可以定义一个 postConfigure 钩子(Hook),比如 this :

pkgs.haskell.lib.overrideCabal yourProject (old: {
postConfigure = ''
substituteInPlace src/Configuration.hs --replace 'helloPrefix = Nothing' 'helloPrefix = Just "${pkgs.hello}"'
'';
})

关于haskell - 如何使用 Nix 替换源代码中不在 PATH 中的可执行文件的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45026060/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com