Configurer VSCode pour Haskell (Debian/Nix/NixOS)

Voir aussi : vidéo youtube - vidéo peertube - journal linuxfr - english version

Comme beaucoup de langage de programmation, Haskell n’a pas d’environnement de développement officiel ni même consensuel. Cependant, il existe différentes configurations classiques : Emacs + Intero/Dante, Vim + Ghcid, IntelliJ-Haskell…

Depuis quelques temps, l’éditeur de texte Visual Studio Code propose un environnement intéressant pour développer en Haskell, notamment couplé à HIE et à Stack. Cette configuration apporte les principales fonctionnalités d’un IDE : coloration syntaxique, navigation de code, compilation, documentation, auto-complétion… Cependant, l’installation de ces outils n’est pas complètement triviale. Cet article explique comment la réaliser avec Debian, avec Debian + Nix et avec NixOS.

Aperçu des outils

Visual Studio Code est un éditeur de texte extensible, supporté par Microsoft. VSCode est un projet open-source mais on installe généralement un binaire non-libre (VS Codium fournit des binaires sous licence libre, selon le même principe que Chrome/Chromium).

Le Language Server Protocol (LSP)), également supporté par Microsoft, est un protocole permettant de réaliser plus facilement des outils de développement (navigation de code, auto-complétion…).

Haskell IDE Engine (HIE) est un backend implémentant LSP pour le langage Haskell.

Haskell Language Server Client est une extension VSCode permettant d’utiliser HIE.

Enfin, Stack est un outil permettant de définir et de construire un projet Haskell. Stack permet de faire fonctionner HIE et est utilisable depuis VSCode.

Installation avec Debian

L’installation sous Debian de la toolchain “VS code - HIE - client HIE - Stack” est assez pénible. Ces outils ne sont pas fournis par la logithèque (ou alors dans des versions obsolètes), il faut donc les installer “à la main” et parfois même les compiler (pour HIE, prévoir 4 Go de RAM et 1h de compilation).

sudo apt install libicu-dev libncurses-dev libgmp-dev libtinfo-dev 
curl -sSL https://get.haskellstack.org/ | sh
sudo apt install ./<file>.deb
git clone https://github.com/haskell/haskell-ide-engine --recurse-submodules
cd haskell-ide-engine
./install.hs build

Et avec un peu de chance, la toolchain fonctionne. Personnellement, je n’ai pas réussi à la faire fonctionner complètement…

Debian + Nix

Nix est un gestionnaire de paquets utilisable sur les distributions linux. Nix permet également d’utiliser le système de cache Cachix, ce qui permet d’installer notre toolchain Haskell/VSCode en quelques minutes.

sudo apt install curl rsync build-essential libgmp-dev
curl https://nixos.org/nix/install | sh
nix-channel --add https://nixos.org/channels/nixos-19.09 nixpkgs
nix-channel --update
echo ". $HOME/.nix-profile/etc/profile.d/nix.sh" >> ~/.bashrc
source ~/.bashrc
{ allowUnfree = true; }
nix-env -iA nixpkgs.cachix
cachix use all-hies
self: super: 
let 
  all-hies = import (fetchTarball "https://github.com/infinisil/all-hies/tarball/master") {};
in {
  hies = all-hies.selection { selector = p: { inherit (p) ghc865 ghc844; }; };
}
nix-env -iA nixpkgs.stack nixpkgs.vscode nixpkgs.hies

Et normalement la toolchain fonctionne.

NixOS + home-manager

NixOS est une distribution linux basée sur Nix. Home-manager est un système de gestion de configuration utilisateur basée sur Nix (voir l’article sur home-manager).

{ allowUnfree = true; }
nix-env -iA nixpkgs.cachix
cachix use all-hies
self: super: 
let 
  all-hies = import (fetchTarball "https://github.com/infinisil/all-hies/tarball/master") {};
in {
  hies = all-hies.selection { selector = p: { inherit (p) ghc865 ghc844; }; };
}
  programs.vscode = {
    enable = true;
    haskell = {
      enable = true;
      hie = {
         enable = true;
         executablePath = "${pkgs.hies}/bin/hie-wrapper";
      };
    };
  };
home-manager switch

Et c’est tout. L’intégration de HIE dans VSCode est faite automatiquement.

Tester l’installation

stack new myproject --resolver=lts-14
cd myproject
code .