styx icon indicating copy to clipboard operation
styx copied to clipboard

A nix-based Haskell project manager

  • Styx: a nix-based multi-repo Haskell project manager

"Styx: there is no looking back."

Styx is a convenient wrapper around ~cabal2nix~, ~nix-shell~ and ~cabal new-~.

** Installation

  • get nix: https://nixos.org/nix/

  • install the prerequisites (cabal2nix and cabal)

    #+BEGIN_SRC shell nix-env -f "" -iA haskellPackages.cabal2nix nix-env -f "" -iA haskellPackages.cabal-install #+END_SRC

  • install styx: #+BEGIN_SRC shell nix-env -f "" -iA haskellPackages.styx #+END_SRC

** Configuration

In a directory of your choice, create a ~styx.yaml~ file like so:

#+BEGIN_EXAMPLE

List the packages that you edit locally and want compiled "all the time", by cabal:

local-packages: my-main-package: # package name location: main # location on your disk (directory) my-local-dep: # package name location: dep # location on your disk (directory)

Optionally, list patched or cutting edge packages that you depend on.

These will be compiled only once, by nix.

source-deps: mtl: location: https://github.com/mrawesome/awsm-patched-version-of-mtl.git # revision: cc9a31305421f6bc72cc1f107f1270bd178c78a1 # optional

Optionally, add other haskell nix packages to depend on.

Normally this is not necessary, because nix will track the dependencies on its own.

Thus this section is mostly useful for throw-away projects which do not have a well-formed cabal file.

nix-deps: - criterion - gasp - lens - statistics

In case you depend on other non-haskell tools or libs.

non-haskell-deps: - z3

Optionally, one can ask for a specific version of nixpkgs:

nixpkgs: commit: 8ef3eaeb4e531929ec29a880cb4c67f790e5eb70 sha256: 4d2fae900d2d99ea294f4f412289af77152ac21d7b2e9ff23581ef11ea00831f

or like this: url: https://github.com/NixOS/nixpkgs-channels/archive/nixos-14.12.tar.gz

Optionally, one can ask for a specific version of ghc, as known by nixpkgs

default-compiler: ghc801 #+END_EXAMPLE

Then, the command

#+BEGIN_SRC shell styx configure #+END_SRC

will create one nix file for each external package, a suitable ~shell.nix~, and a ~cabal.project~ file.

** Use

You can then access the sandbox, inside the nix shell, like so: #+BEGIN_SRC nix-shell .styx/shell.nix --run "cabal ..." #+END_SRC

Styx provides a couple of convenience commands: #+BEGIN_SRC shell $ styx build # runs cabal new-build in the shell $ styx repl # runs cabal new-repl in the shell $ styx exec # runs cabal exec in the sandbox $ styx cabal # runs cabal in the sandbox #+END_SRC