【发布时间】:2017-12-15 00:21:54
【问题描述】:
我希望编写一些调用可执行文件的 Haskell 作为其工作的一部分;并将其安装在 nixOS 主机上。我不希望可执行文件在我的 PATH 中(并且依赖它会破坏 nix 的漂亮依赖模型)。
如果这是一个 Perl 脚本,我将有一个简单的构建器来查找特定格式的字符串,并根据 .nix 文件中声明的依赖关系将它们替换为可执行文件名称。但是对于 haskell 常见的基于阴谋集团的建筑,这似乎有点困难。
在 nix 上的 Haskell 代码中,是否有用于在构建时(包括开发期间以及安装时)对可执行文件路径进行编码的标准习惯用法?
为了一个具体的例子,这里有一个简单的“脚本”:
import System.Process ( readProcess )
main = do
stdout <- readProcess "hostname" [] ""
putStrLn $ "Hostname: " ++ stdout
我希望能够编译运行它(原则上)而不依赖于 PATH 中的主机名,而是用完整的 /nix/store/-inetutils-/bin/hostname 路径替换主机名,因此也在 nix 下获得依赖管理的好处。
这可以通过使用 shell(或类似)脚本来管理,该脚本使用上述定义的替换方案构建,该脚本设置了 haskell 可执行文件所期望的环境;但这仍然需要通过 cabal.mkDerivation 进行一些引导,并且由于我是 OptParse-Applicative 的 bash 完成的爱好者,所以我不愿意用另一个脚本来减慢它,每次我点击 tab 键时都会启动它。但如果这是我们需要的,那就够公平了。
我确实查看了 cabal.mkDerivation 以了解某种预构建步骤,但如果它在那里,我看不到它。
谢谢,
【问题讨论】:
-
所有 Linux 发行版中的可执行文件不需要在路径中吗? (无论是否)
-
不,如果您使用可执行文件的完整(绝对)名称,则不会。路径只是一种方便。
-
你说得对,我完全忘记了绝对路径。
-
我对@987654322@ 的(初步)理解是它应该自己处理特定程序的环境设置。为什么要在 Haskell 中重新实现该逻辑?换句话说,您说您有“.nix 文件中声明的依赖项” -
nix可以在程序执行期间将这些依赖项添加到 PATH 中吗? (如果对nix的这种理解完全错误,请随意忽略......) -
nix 将在程序的 build 期间处理设置环境,但在程序安装后的 runtime 期间没有什么特别的事情发生(我相信您可以通过比较 env 的字符串输出(其中包含构建期间使用的字符串)与运行 env 的输出来证明这一点)。所以我的目标是将构建阶段使用的字符串(代表我希望运行的依赖可执行文件)放入可执行文件(或者可能是可执行文件拥有的固定位置的数据文件),以便它可以读取并调用它们,并且依赖项将被记录。
标签: haskell executable nix nixos