elm2nix

Convert an Elm project into
Nix expressions.
It consists of multiple commands:
elm2nix convert: Given elm.json in current directory, all dependencies are
parsed and their sha256sum calculated
elm2nix snapshot: Downloads snapshot of http://package.elm-lang.org into versions.dat
elm2nix init: Generates default.nix that glues everything together
Assumptions
Supports Elm 0.19.1
Installation
From nixpkgs (recommended)
Make sure you have up to date stable or unstable nixpkgs channel.
$ nix-env -i elm2nix
From source
$ git clone https://github.com/domenkozar/elm2nix.git
$ cd elm2nix
$ nix-env -if .
Usage
$ git clone https://github.com/evancz/elm-todomvc.git
$ cd elm-todomvc
$ elm2nix init > default.nix
$ elm2nix convert > elm-srcs.nix
$ elm2nix snapshot > versions.dat
$ nix-build
$ chromium ./result/Main.html
Running tests (as per CI)
$ ./scripts/tests.sh
FAQ
Why is mkDerivation inlined into default.nix?
As it’s considered experimental, it’s generated for now. Might change in the future.
How to use with ParcelJS and Yarn?
Instead of running elm2nix init, use something like:
{ pkgs ? import <nixpkgs> {}
}:
let
yarnPkg = pkgs.yarn2nix.mkYarnPackage {
name = "myproject-node-packages";
packageJSON = ./package.json;
unpackPhase = ":";
src = null;
yarnLock = ./yarn.lock;
publishBinsFor = ["parcel-bundler"];
};
in pkgs.stdenv.mkDerivation {
name = "myproject-frontend";
src = pkgs.lib.cleanSource ./.;
buildInputs = with pkgs.elmPackages; [
elm
elm-format
yarnPkg
pkgs.yarn
];
patchPhase = ''
rm -rf elm-stuff
ln -sf ${yarnPkg}/node_modules .
'';
shellHook = ''
ln -fs ${yarnPkg}/node_modules .
'';
configurePhase = pkgs.elmPackages.fetchElmDeps {
elmPackages = import ./elm-srcs.nix;
versionsDat = ./versions.dat;
};
installPhase = ''
mkdir -p $out
parcel build -d $out index.html
'';
}