Journal Configurer VSCode pour Haskell (Debian/Nix/NixOS)

Posté par  (site Web personnel) . Licence CC By‑SA.
Étiquettes :
14
25
déc.
2019

Sommaire

Comme beaucoup de langages 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 quelque 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. Ce journal explique comment la réaliser avec Debian, avec Debian + Nix et avec NixOS (voir également la vidéo YouTube).

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 back‑end 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.

VSCode

Installation avec Debian

L’installation sous Debian de la toolchain « VSCode + 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 Gio de mémoire vive et 1 h de compilation).

  • installer les dépendances :

    sudo apt install libicu-dev libncurses-dev libgmp-dev libtinfo-dev
  • installer Stack :

    curl -sSL https://get.haskellstack.org/ | sh
  • télécharger VSCode et l’installer :

    sudo apt install ./<file>.deb
  • compiler et installer HIE :

    git clone https://github.com/haskell/haskell-ide-engine --recurse-submodules
    cd haskell-ide-engine
    ./install.hs build
  • lancer VSCode et installer l’extension Haskell Language Server ;

  • configurer l’extension ou le PATH (avec $HOME/.local/bin et $(stack path --compiler-bin)).

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 GNU/Linux. Nix permet également d’utiliser le système de cache Cachix, ce qui permet d’installer notre toolchain Haskell/VSCode en quelques minutes.

  • installer les dépendances Debian :

    sudo apt install curl rsync build-essential libgmp-dev
  • installer et configurer Nix :

    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
  • autoriser les logiciels non libres, dans ~/.config/nixpkgs/config.nix :

    { allowUnfree = true; }
  • installer cachix et activer le cache pour HIE :

    nix-env -iA nixpkgs.cachix
    cachix use all-hies
  • ajouter un overlay pour HIE, dans ~/.config/nixpkgs/overlays/hies.nix :

    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; }; };
    }
  • installer Stack, VSCode et HIE :

    nix-env -iA nixpkgs.stack nixpkgs.vscode nixpkgs.hies
  • lancer VSCode et installer l’extension Haskell Language Server.

Et normalement la toolchain fonctionne.

NixOS + home‑manager

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

  • autoriser les logiciels non libres, dans ~/.config/nixpkgs/config.nix :

    { allowUnfree = true; }
  • installer cachix et activer le cache pour HIE :

    nix-env -iA nixpkgs.cachix
    cachix use all-hies
  • ajouter un overlay pour HIE, dans ~/.config/nixpkgs/overlays/hies.nix :

    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; }; };
    }
  • activer VSCode + HIE, dans ~/.config/nixpkgs/home.nix :

      programs.vscode = {
        enable = true;
        haskell = {
          enable = true;
          hie = {
             enable = true;
             executablePath = "${pkgs.hies}/bin/hie-wrapper";
          };
        };
      };
  • mettre à jour la configuration utilisateur :

    home-manager switch

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

Tester l’installation

  • créer un projet Haskell et lancer VSCode :

    stack new myproject --resolver=lts-14
    cd myproject
    code .
  • une fois VSCode lancé, vérifier la navigation de code, l’auto‑complétion, la compilation avec Stack dans la console VSCode ;

  • si HIE donne une erreur dans VSCode, supprimer le dossier de cache .cache/cabal-helper.

  • # grand merci

    Posté par  . Évalué à 2.

    Merci pour ce journal que j'ai gardé sous le coude pendant les vacances avant de le lire en détail.

    Il tombe à point car je veux faire un peu plus de Haskell et que je cherche un environnement de dev.
    J'ai vu des démos sympa à base de neovim mais je ne suis pas assez câlé sur cet outil. Je ne voulais pas ajouter cette marche à celle de l'apprentissage du langage.

    Comme je trouve vscode plus abordable, je suis parti dans cette direction.
    En appliquant ta recette Debian, j'ai l'essentiel : auto-complétion (CTRL+space), accès la définition (CTRL+click), tooltip de documentation, accès à la documentation.
    Par contre je n'ai pas l'exécution et le debug. Je peux le contourner avec un "stack watch"…

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n’en sommes pas responsables.