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

Her*_*ral 9 haskell sandbox package-managers cabal

Haskell新手和Python家伙在这里.

我想我可能会在这里遗漏一些东西但是如果你看看Yesod的快速启动,那么autor 之前会 安装一些软件包cabal sandbox init.我在其他地方看到过相同的模式.问题:

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

非常感谢你提前!

Jus*_*ood 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不会将其安装到上一级别的沙箱中,而是将其安装到全局或用户数据库中,具体取决于您的cabal配置方式.


dan*_*iaz 6

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

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

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

(额外提示:cabal exec gchi是一个有用的命令,可以ghci识别沙箱的内容.)