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

时间:2015-01-25 21:25:27

标签: haskell sandbox cabal package-managers

Haskell新手和Python家伙。

我想我可能在这里遗漏了一些内容,但是如果你看Yesod's quickstart,那么autor会在 cabal sandbox init之前安装一些包。我在其他地方看到过相同的模式。问题:

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

2 个答案:

答案 0 :(得分:8)

  1. 是的,这是如何使用沙箱。

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

    cabal install some_package会将该软件包安装到沙箱中。

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

  3. 阅读第2点

  4. cabal sandbox init并没有改变你的道路,因为它并不是真的需要。只需在PATH=.cabal-sandbox/bin:$PATH中添加.bash_profile即可。

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

    我发现cabal沙箱唯一真正的缺点是你需要在根目录中才能对沙箱进行操作。这意味着,如果您在子目录中,则运行cabal install some_package将不会将其安装到一个级别的沙箱中,而是将其安装到全局或用户数据库中,具体取决于您的方式{{1} 1}}已配置。

答案 1 :(得分:6)

cabal exec允许您在沙箱的上下文中执行程序。它会更改路径以包含沙箱的bin文件夹。您可以通过在沙箱中执行cabal exec printenv来查看它。

此外,cabal的最新版本允许您在没有.cabal文件的文件夹中创建沙箱。运行cabal sandbox init后,您只需cabal install所需的依赖项。

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

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