如何在一个直接的nix-pill 8.1模仿中找到cabal?

时间:2017-09-30 05:01:39

标签: haskell cabal nix

以下示例中未找到阴谋集团,问题是如何更正示例以便找到阴谋集团。

这个例子对the nix pill 8.1进行了非常严格的修改。在nix-repl上,键入:l <nixpkgs>然后"${cabal-install}"会给出cabal-install所在商店的路径,它包含带有包含cabal可执行文件的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

下面你应该找到与&#34; make c&#34;相对应的文件。示例

与他们一起,

> nix-build hello.nix

不起作用。它首先告诉我们构建&#34;这些推导&#34;然后说那个

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

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

hello_builder.sh甚至比c-example更短。请注意,安装部件仍然缺失(首先应该建立构建器以查找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 - 在使用cabal-install和ghc的nix-shell中,这可行。

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不能在这里使用。

1 个答案:

答案 0 :(得分:1)

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

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

相关问题