如何在简单的 nix-pill 8.1 仿制品中找到 cabal?

How to make cabal to be found in a straigthforward nix-pill 8.1 imitation?

在以下示例中未找到 cabal,问题是如何更正示例以便找到 cabal。

这个例子是 the nix pill 8.1 的非常直接的修改。在 nix-repl 上,键入 :l <nixpkgs> 然后 "${cabal-install}" 给出了 cabal-install 所在商店的路径,它包含子目录和包含 cabal-executable 的 bin。即

> /nix/store/pathtocabal-install/bin/cabal -v
cabal-install version 2.0.0.0
compiled using version 2.0.0.2 of the Cabal library

您应该在下面找到与 "make c" 示例对应的文件。

有了他们,

> nix-build hello.nix

不起作用。它首先告诉构建 "these derivations" 然后说

hello_builder.sh: line 2: cabal: command not found

我怀疑 $cabal-install/bin 是引用 cabal 的错误方式,但在 nix-repl 上找到了它的存储路径。

hello_builder.sh 甚至比 c 示例中的更短。请注意,安装部分仍然缺失(首先应该让构建器找到 cabal)。

export PATH="$coreutils/bin:$ghc/bin:$cabal-install/bin:$binutils/bin"
cabal build hello

hello.nix - 也许不需要 binutils。

with (import <nixpkgs> {});
derivation {
  name = "hello";
  builder = "${bash}/bin/bash";
  args = [ ./hello_builder.sh ];
  inherit binutils coreutils ghc cabal-install;
  src = ./hello.cabal;
  system = builtins.currentSystem;
}

hello.cabal - 在 nix-shell 中使用 cabal-install 和 ghc,这有效。

name:                hello
version:             0.1.0.0
build-type:          Simple
cabal-version:       >=1.24

executable hello
  main-is:             hello.hs
  default-language:    Haskell2010
  build-depends:       base              >=4.9 && <4.10

hello.hs

module Main where

main :: IO ()
main = putStrLn "Hello there!"

后期添加:

在构建器中加入echo $PATH,可以看出路径不对。是/nix/store/...coreutils-8.28/bin:/nix/store...ghc-8.0.2/bin:-install/bin:/nix/store/...binutils-2.28.1/bin$cabal 变成了一个空字符串,它不是指 $cabal-install。因此 cabal 可执行文件没有正确的存储路径。

这部分回答了问题的部分原因以及如何更正它。开放的原因部分是,为什么 inherit cabal-install 不能在这里使用。

inherit cabal-install; 的问题是 cabal-install 不是 BASH 中的有效变量名。 Nix 将提供给 derivation 的集合中的键转换为 BASH.

中的变量

您可以执行 cabal_install = cabal-install; 之类的操作,然后在构建器中使用 cabal_install 而不是 inherit cabal-install;