NixOS, Pandoc and Hakyll
My setup
Since Hakyll sites are generated by Haskell programs, I thought I would
just use the Haskell ecosystem in NixOS to build my program, and then override
the installPhase with something that executes the program and copies the
site files to the correct location. Following the instructions in the
NixOS User Guide,
I generate the main nix file with cabal2nix and manually add the default.nix
and shell.nix files. I then make a small change to the themk.net.nix
file generated by cabal2nix.
themk.net.nix
{ mkDerivation, base, hakyll, stdenv }:
mkDerivation {
  pname = "themk-net";
  version = "0.1.0.0";
  src = ./.;
  isLibrary = false;
  isExecutable = true;
  executableHaskellDepends = [ base hakyll ];
  license = stdenv.lib.licenses.bsd3;
  # ------- Change is here -------------------
  # Override the installPhase to execute the
  # program, and copy the results to $out
  installPhase = ''
    mkdir -p $out
    ./dist/build/site/site build
    cp -a _site/* $out
  '';
}We can now use this package from within configuration.nix to set
up httpd to point to our new derivation. In order to do this we
need to determine the sha256 hash of the commit we are interested in.
To do this, use the command
nix-prefetch-git <git url> <commit hash>
Here are the relevant parts of my configuration.nix
configuration.nix
let
  sitesrc = pkgs.fetchgit {
    url = https://github.com/luke-clifton/themk.net.git; 
    rev = "623f2e60193d0351234df1a3a6a4161badffd668"; 
    sha256 = "1cb0f50c085ec2d25231992799a29c5d15c4ebae6da8e3ef3cf5abe0f5d80d84"; 
  }; 
  site = pkgs.callPackage "${sitesrc}" {}
in {
  # ...
 
  services.httpd = {
      adminAddr = "webmaster@themk.net";
      enable = true;
      hostName = "themk.net";
      documentRoot = "${site}";
    };
  # ...
}