问题
Haskell newbie and Python guy here.
I think I may be missing something here but if you look at Yesod's quickstart, the autor install some packages before cabal sandbox init
. I have seen the same pattern elsewhere. Questions:
- Am I missing something? Is this the real way to use cabal sandbox?
- Why can't (or shouldn't) I install yesod-bin inside a sandbox?
- What if I use different versions of yesod-bin throughout some projects?
- If there is some libraries that install binaries inside .cabal-sandbox/bin, why
cabal sandbox init
don't change PATH in order to match the sandboxed version?
Thank you very much in advance!
回答1:
Yes, this how to use a sandbox.
cabal sandbox init
will create some files / directories for you that will keep track of the packages you have installed.cabal install some_package
will install that package into the sandbox.You are more than welcome to install
yesod-bin
into a sandbox.Read point 2
cabal sandbox init
doesn't change your path, because it doesn't really need to. Just addPATH=.cabal-sandbox/bin:$PATH
in your.bash_profile
.Unlike virtual-env, you never need to 'enable' or 'disable' a sandbox. You just
cd
into a directory, and it is automatically enabled.The only real downside I have found to cabal sandboxes, is that you need to be in the root directory in order to act upon a sandbox. Meaning, if you are in a sub-directory, running
cabal install some_package
will not install it into the sandbox that is up a level, instead it will install it into either the global or user database, depending on how you havecabal
configured.
回答2:
cabal exec
lets you execute a program in the context of a sandbox. It changes the path to include the bin
folder of the sandbox. You can see it by executing cabal exec printenv
inside the sandbox.
Also, the latest versions of cabal
let you create sandboxes in folders without .cabal
files. Once you run cabal sandbox init
, you can just cabal install
the dependencies you need.
So, to use different versions of yesod-bin
, install them in different sandboxes, and then invoke cabal exec yesod-bin
on each one.
(Extra tip: cabal exec gchi
is a useful command that makes ghci
aware of the contents of the sandbox.)
来源:https://stackoverflow.com/questions/28141705/why-cabal-sandbox-init-does-not-change-path-like-virtualenv-does