
On Sun, Mar 21, 2021 at 08:14:09AM +0000, Tom Ellis wrote:
On Thu, Feb 18, 2021 at 03:35:10PM -0500, Viktor Dukhovni wrote:
You can use "cabal repl -z" to run ghci with the Cabal "user" package database in scope:
I'm confused by this. What is 'the Cabal "user" package database'? The --help text says
-z --ignore-project Only include explicitlyspecified packages (and 'base').
With the "-z" flag, "cabal repl" stops looking for ".cabal" files in the current directory (sandbox if you like), and just works with whatever is installed in the Cabal package database. Thus, because I've previously compiled optparse-applicative and streaming-bytestring: $ (cd ~/.cabal/store/ghc-8.10.4; ls -d optparse-applicative* streaming-byte*) optparse-applicative-0.16.1.0-eee378057b7539bcf75579d76e9f4ff170b047a9ccc498b6fe1ba5d2dfa9075a streaming-bytestring-0.2.0-8e7f82f7151e104bdca4aac21a045ebe5b332e0490a839f8fba8a3901dfcd58a I can run: $ cabal repl -v0 -z λ> import Data.Either λ> :set -package bytestring λ> import Data.ByteString λ> :set -package streaming-bytestring λ> import Streaming.ByteString λ> :set -package optparse-applicative λ> import Options.Applicative λ> :t strOption strOption :: Data.String.IsString s => Mod OptionFields s -> Parser s λ> :t unconsChunk unconsChunk :: Monad m => ByteStream m r -> m (Either r (Data.ByteString.ByteString, ByteStream m r)) whereas the same does not generally work with just ghci, which does not know about Cabal's package store: $ ghci -v0 λ> :set -package bytestring λ> :set -package streaming-bytestring cannot satisfy -package streaming-bytestring (use -v for more information) λ> :set -package optparse-applicative cannot satisfy -package optparse-applicative (use -v for more information) However, (perhaps dependent on one's Cabal configuration settings) when I use "cabal install --lib some-package" I also end up with a GHC environment file created as a side-effect of the "cabal install". Below I request "base" which is already there, so the only effect is to create the environment file: $ cabal install --lib base Resolving dependencies... Up to date $ cat ~/.ghc/x86_64-freebsd-8.10.4/environments/default clear-package-db global-package-db package-db /home/viktor/.cabal/store/ghc-8.10.4/package.db package-id ghc-8.10.4 package-id bytestring-0.10.12.0 package-id unix-2.7.2.2 package-id base-4.14.1.0 package-id time-1.9.3 package-id hpc-0.6.1.0 package-id filepath-1.4.2.1 package-id process-1.6.9.0 package-id array-0.5.4.0 package-id integer-gmp-1.0.3.0 package-id containers-0.6.4.1 package-id ghc-boot-8.10.4 package-id binary-0.8.8.0 package-id ghc-prim-0.6.1 package-id ghci-8.10.4 package-id rts-1.0.1 package-id terminfo-0.4.1.4 package-id transformers-0.5.6.2 package-id deepseq-1.4.4.0 package-id ghc-boot-th-8.10.4 package-id pretty-1.1.3.6 package-id template-haskell-2.16.0.0 package-id directory-1.3.6.0 package-id text-1.2.4.1 Once the environment file is in place, I can: $ ghci -v0 λ> import Data.Either λ> :set -package optparse-applicative λ> import Options.Applicative λ> :set -package streaming-bytestring λ> import Streaming.ByteString λ> :set -package bytestring λ> import Data.ByteString λ> :t strOption strOption :: Data.String.IsString s => Mod OptionFields s -> Parser s λ> :t unconsChunk unconsChunk :: Monad m => ByteStream m r -> m (Either r (Data.ByteString.ByteString, ByteStream m r))
I can't see any evidence locally that it brings any packages into scope. Could you please clarify exactly what -z is doing in your example below?
With "-z" I can load any pre-built library from the Cabal package store, rather than just the dependencies of the current project. -- Viktor.