# GHCi `stack ghci` allows you to load components and files of your project into `ghci`. It uses the same TARGET syntax as `stack build`, and can also take options like `--test`, `--bench`, and `--flag`. Similarly to `stack build`, the default is to load up ghci with all libraries and executables in the project. In order to load multiple components, `stack ghci` combines all of the ghc options together. This doesn't work in the general case, but when the packages being loaded share similar conventions, it should work out. A common source of issues is when one component defines default extensions which aren't assumed by another component. For example, specifying `NoImplicitPrelude` in one component but not another is quite likely to cause failures. `ghci` will be run with `-XNoImplicitPrelude`, but it is likely that modules in the other component assume that the Prelude is implicitly imported. ## Selecting Main module When loading multiple packages, there may be multiple definitions for the `Main` module. You can specify which Main module to load by passing in the `--main-is TARGET` flag. If no selection is made and there are multiple `Main` modules, you will be asked to select from a list of options. ## Speeding up initial load There are two ways to speed up the initial startup of ghci: * `--no-build`, to skip an initial build step. This only works if the dependencies have already been built. * `--no-load`, to skip loading all defined modules into ghci. You can then directly use `:load MyModule` to load a specific module in your project. ## Loading a filepath directly Instead of the `TARGET` syntax, it is also possible to directly run `stack ghci src/MyFile.hs`. This will figure out which component the file is associated with, and use the options from that component. ## Specifying extra packages to build / depend on Sometimes you want to load ghci with an additional package, that isn't a direct dependency of your components. This can be achieved by using the `--package` flag. For example, if I want to experiment with the lens library, I can run `stack ghci --package lens`. ## Running plain ghci `stack ghci` always runs ghci configured to load code from packages in your project. In particular, this means it passes in flags like `-hide-all-packages` and `-package-id=` in order to configure which packages are visible to ghci. For doing experiments which just involve packages installed in your databases, it may be useful to run ghci plainly like `stack exec ghci`. This will run a plain `ghci` in an environment which includes `GHC_PACKAGE_PATH`, and so will have access to your databases.