Haskell 開発環境 nix flake と direnv その2
Haskell project の開発環境を nix flake
と direnv
で作成する記事を書いたが、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-install
と haskell-language-server
がインストールされた状態の開発環境ができあがる。