如何在简单的 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;
。
在以下示例中未找到 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;
。