为什么 cabal sandbox init 不像 virtualenv 那样改变 PATH?

Why cabal sandbox init does not change PATH like virtualenv does?

Haskell 新手和 Python 伙计。

我想我可能在这里遗漏了一些东西,但是如果你看一下 Yesod's quickstart,自动安装一些包 before cabal sandbox init。我在别处看到过同样的模式。问题:

  1. 我错过了什么吗?这是使用 cabal 沙箱的真正方法吗?
  2. 为什么我不能(或不应该)在沙箱中安装 yesod-bin?
  3. 如果我在某些项目中使用不同版本的 yesod-bin 会怎样?
  4. 如果有一些库在 .cabal-sandbox/bin 中安装二进制文件,为什么 cabal sandbox init 不更改 PATH 以匹配沙盒版本?

非常感谢您!

  1. 是的,这就是沙箱的使用方法。

    cabal sandbox init 将为您创建一些文件/目录,用于跟踪您已安装的软件包。

    cabal install some_package 会将那个包安装到沙盒中。

  2. 非常欢迎您将 yesod-bin 安装到沙箱中。

  3. 读取点2

  4. cabal sandbox init 不会改变你的路径,因为它真的不需要。只需在 .bash_profile 中添加 PATH=.cabal-sandbox/bin:$PATH

    与 virtual-env 不同,您永远不需要 'enable' 或 'disable' 沙箱。您只需 cd 进入一个目录,它就会自动启用。

    我发现 cabal 沙箱唯一真正的缺点是您需要在根目录中才能对沙箱进行操作。意思是,如果你在一个子目录中,运行 cabal install some_package 不会将它安装到上一层的沙箱中,而是将它安装到全局或用户数据库中,具体取决于如何您已 cabal 配置。

cabal exec 让您可以在沙箱环境中执行程序。它更改路径以包含沙盒的 bin 文件夹。您可以通过在沙箱内执行 cabal exec printenv 来查看它。

此外,最新版本的 cabal 允许您在没有 .cabal 文件的文件夹中创建沙箱。一旦你 运行 cabal sandbox init,你就可以 cabal install 你需要的依赖项。

因此,要使用不同版本的 yesod-bin,请将它们安装在不同的沙箱中,然后在每个沙箱上调用 cabal exec yesod-bin

(额外提示:cabal exec gchi 是一个有用的命令,可以让 ghci 了解沙箱的内容。)