elm2nix
elm2nix copied to clipboard
Convert Elm project into Nix expressions
elm2nix
Convert an Elm project into Nix expressions.
It consists of multiple commands:
elm2nix convert: Givenelm.jsonin current directory, all dependencies are parsed and their sha256sum calculatedelm2nix snapshot: Downloads snapshot of http://package.elm-lang.org intoversions.datelm2nix init: Generatesdefault.nixthat 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
'';
}