Haskell 開発環境 nix flake と direnv

Haskell project の開発環境を nix flakedirenv で作成する。

プロジェクトdirectoryを nix flake 用に準備

まずは、nixos のテンプレートを使って、Base となるdirectoryを作成。

mkdir /tmp/haskell-demo
cd /tmp/haskell-demo
nix flake new -t templates#haskell-nix .

flake.nix を少し単純にする

{
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
    flake-utils.url = "github:numtide/flake-utils";
  };

  outputs = { self, nixpkgs, flake-utils }:
    flake-utils.lib.eachDefaultSystem (system:
      let
        pkgs    = nixpkgs.legacyPackages.${system};
        overlay = final: prev: {
          hello = prev.callCabal2nix "hello" ./. { };
        };
        haskellPackages = pkgs.haskellPackages.extend overlay;
      in {
        # nix build
        packages.default = haskellPackages.hello;

        # nix develop
        devShells.default = haskellPackages.shellFor {
          packages = p: [ p.hello ];
          buildInputs = with haskellPackages; [
            cabal-install
            haskell-language-server
          ];
        };
      }
    );
}

direnv を有効化

ここで direnv を有効にする。それには .envrc を以下のように作成し、

use flake

以下のコマンドで有効にする。

direnv allow .

これで、 cabal-installhaskell-language-server がインストールされた状態の開発環境ができあがる。