a Haskell Development Environment consist in a compiler (ghc
), a language server (hls
), a building tool (cabal
or stack
), and an editor compatible with the language server protocol.
The best way to have a coherent installation of these components is with the ghcup tool.
- Step 1: Install GHCup. You'll be prompted to install some tools. Say yes to
hls
. Do not installstack
yet (see below). - Step 2: Install vscode
- Step 3: Open vscode and install the haskell extension either using the extension panel or pressing CTRL+P and
ext install haskell.haskell
.
If you want an editor different from vscode, check the documentation here
to integrate stack
with haskell-language-server
, you should configure it properly.
The key point is to prevent stack
to install ghc
on its own. Follow these steps:
-
First, You still need to follow the three steps at the top of this guide. You can't get a proper working environment solely with
stack
. -
Skip this point if you installed
stack
independently fromghcup
. In a terminal runghcup install stack
-
Configure
stack
to use system'sghc
. Configuration can be either global (recomended) or local- Global (recomended)
# Run on a terminal if you want to set a global configuration stack config set install-ghc --global false stack config set system-ghc --global true
- Local:
# On stack.yaml add this line if you want to set a local configuration system-ghc: true
- Global (recomended)
-
You must use a
stack
snapshot compatible with theghc
version installed byghcup
. Visit stackage to get theghc
version on each sanpshot. For examplelts-18.28
usesghc-8.10.7
. You can check version compatibility with:# This prints the ghc's version installed by ghcup > ghcup list -c installed -t ghc ✔✔ ghc 8.10.7 recommended,base-4.14.3.0 hls-powered # Your resolver should point to 18.28 --------------------------------------------------- > cat stack.yaml # vvvvv resolver: url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/18/28.yaml
In case you need to use a different snapshot you have to install it's ghc
version with ghcup
. For the sake of example, let say you are using lts-16.31
, which uses ghc-8.8.4
. Then you need to run ghcup install ghc 8.8.4
on a terminal. Also, depending on which snapshot you are using, you might loose integration with hls
. Check hls
documentation for more info.
I see! I've never encountered that before by using the ghcup-installed hls + stack-downloaded ghc workflow before. I guess it's still not impossible though. I'm interested in what your error is - do you want to share it, if you still have it on hand?
I would still not call it working "luck" though - from the same document you linked:
So it sounds to me like the expected case is that it would work, and it not working is a case of misfortune (unless it happens that this is not the reality more often than not, in which case the stack docs should be updated.).
Another point that reinforces this hypothesis is the fact that the default
ghc
mirrors stack uses (as far as I can tell) are the same ones as the ones hosted on https://downloads.haskell.org, which means that forstack
should be falling under the first clause, and should not require a HLS built from source.