jyp / Styx
Programming Languages
- 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
https://github.com/NixOS/nixpkgs-channels/archive/nixos-14.12.tar.gz
or like this: url: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