Haskell 開発環境 nix flake と direnv その2

Haskell project の開発環境を nix flakedirenv で作成する記事を書いたが、shell.nixを使ったほうが良いみたいなので、アップデート。

プロジェクト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};
        in
          {
            devShells.default = import ./shell.nix { inherit pkgs; };
          }
      );
}

新たに shell.nix を作成。

{ pkgs ? import <nixpkgs> {} }:

pkgs.haskellPackages.shellFor {
  packages = hpkgs: [ (hpkgs.callPackage ./haskell-demo.nix {}) ];

  # development tools we use
  nativeBuildInputs = [
    pkgs.zlib
    pkgs.postgresql
    pkgs.cabal-install
    pkgs.haskellPackages.doctest
    pkgs.hpack
    pkgs.cabal2nix
    pkgs.haskellPackages.fourmolu
    pkgs.haskell-language-server
    pkgs.stack
  ];

  # Extra arguments are added to mkDerivation's arguments as-is.
  # Since it adds all passed arguments to the shell environment,
  # we can use this to set the environment variable the `Paths_`
  # module of distribution-nixpkgs uses to search for bundled
  # files.
  # See also: https://cabal.readthedocs.io/en/latest/cabal-package.html#accessing-data-files-from-package-code
  distribution_nixpkgs_datadir = toString ./distribution-nixpkgs;
}

haskell-demo.nix は、以下のコマンドで作成。

cabal2nix . > haskell-demo.nix

direnv を有効化

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

use flake

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

direnv allow .

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