Nixified Jekyll setup
What I particularly like about Nix is its ability to encapsulate environments. No need to remember how to set up a certain environment, just encode it in a Nix expression, check it into version control and use nix-shell. This is especially useful when having to occasionally deal with certain environments, without being too familiar with the technical details. For me one such example is Jekyll, a Ruby application (and I am not familiar with Ruby).
I have created a new Jekyll blog and used bundix to convert a Gemfile into a Nix expression (gemset.nix). To this, add the following default.nix:
with (import <nixpkgs> {});
let
ghPagesEnv = bundlerEnv {
name = "mtesseract-github-pages-env";
inherit ruby;
gemdir = ./.;
};
in
{
shell = stdenv.mkDerivation {
name = "mtesseract-github-pages";
buildInputs = [ ghPagesEnv ];
};
serve = stdenv.mkDerivation {
name = "mtesseract-github-pages-serve";
buildInputs = [ ghPagesEnv ];
shellHook = ''
exec ${ghPagesEnv}/bin/jekyll serve --watch
'';
};
}
This expression contains two attributes: shell and serve. Thus, nix-shell -A shell spawns an interactive shell having Jekyll in path, while nix-shell -A serve spawn Jekyll to serve the page at http://localhost:4000. For details, check out the repository of this blog.