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-<command>
.
Installation
- get nix: https://nixos.org/nix/
- install the prerequisites (cabal2nix and cabal)
nix-env -f "<nixpkgs>" -iA haskellPackages.cabal2nix nix-env -f "<nixpkgs>" -iA haskellPackages.cabal-install
- install styx:
nix-env -f "<nixpkgs>" -iA haskellPackages.styx
Configuration
In a directory of your choice, create a styx.yaml
file like so:
# 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
Then, the command
styx configure
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:
nix-shell .styx/shell.nix --run "cabal ..."
Styx provides a couple of convenience commands:
$ styx build # runs cabal new-build in the shell
$ styx repl # runs cabal new-repl in the shell
$ styx exec <cmd> # runs cabal exec in the sandbox
$ styx cabal <cmd> # runs cabal <cmd> in the sandbox