1# Getting started with Hix
3The `hix` tools are wrappers for the various `nix` tools that
4use `haskell.nix` without the need to add any `.nix` files.
8* A quick way to try out haskell.nix for new users.
10* Using haskell.nix to work on projects that do not have
13* Testing to see if `haskell.nix` can build a project.
15* Making `flake` and `non flake` configurations to check `haskell.nix`
20To use Hix you will need to install [Nix](https://nixos.org/download.html).
22## Setting up the binary cache
24IMPORTANT: you *must* do this or you *will* build several copies of GHC!
26You can configure Nix to use our binary cache, which is pushed to by CI, so should contain the artifacts that you need.
28You need to add the following sections to `/etc/nix/nix.conf` or, if you are a trusted user, `~/.config/nix/nix.conf` (if you don't know what a "trusted user" is, you probably want to do the former).
31trusted-public-keys = [...] hydra.iohk.io:f/Ea+s+dFdN+3Y/G+FDgSq+a5NEWhJGzdjvKNGv0/EQ= [...]
32substituters = [...] https://cache.iog.io [...]
35If you're running NixOS, you need to add/update the following in your `/etc/nixos/configuration.nix` files instead.
38# Binary Cache for Haskell.nix
39nix.settings.trusted-public-keys = [
40 "hydra.iohk.io:f/Ea+s+dFdN+3Y/G+FDgSq+a5NEWhJGzdjvKNGv0/EQ="
42nix.settings.substituters = [
43 "https://cache.iog.io"
47NixOS-21.11 and older use slightly different settings.
50# Binary Cache for Haskell.nix
51nix.binaryCachePublicKeys = [
52 "hydra.iohk.io:f/Ea+s+dFdN+3Y/G+FDgSq+a5NEWhJGzdjvKNGv0/EQ="
55 "https://cache.iog.io"
59This can be tricky to get setup properly. If you're still having trouble getting cache hits, consult the corresponding [troubleshooting section](../troubleshooting.md#why-am-i-building-ghc).
64nix-env -iA hix -f https://github.com/input-output-hk/haskell.nix/tarball/master
67## Updating Hix (also updates hackage)
73This is also necessary to make the latest nightly snapshot of hackage
78To run `cabal build` in a nix-shell with all the dependencies required:
83hix-shell --run 'cabal build'
89hix-build -A hsPkgs.hello.components.exes.hello
92Cross compile to JavaScript:
95hix-build -A projectCross.ghcjs.hsPkgs.hello.components.exes.hello
100The configuration arguments for `Hix` can be (from highest precedence to lowest):
102* Passed on the command line with `--arg` (or `--argstr` for string args).
104* Placed in `nix/hix.nix` file in the project dir.
106* Placed in `~/.config/hix/hix.conf`
108For example to build with GHC 8.10.7:
111hix-shell --argstr compiler-nix-name ghc8107 --run 'cabal build'
114or add a `nix/hix.nix` or `~/.config/hix/hix.conf` file:
117{ compiler-nix-name = "ghc8107"; }
120Here are just a few of the other configuration arguments you could use
121in the files or on the command line (they are all optional):
124{ name = "hello"; # for better error messages and derivation names
125 nixpkgsPin = "nixpkgs-unstable"; # or nixpkgs-2111 or nixpkgs-2105
126 nixpkgs = <nixpkgs>; # use this instead of nixpkgsPin
127 subDir = "some/sub/dir"; # sub dir containing the haskell project
128 projectFileName = "stack.yaml"; # use this project file
129 tools.haskell-language-server = "latest";
130 tools.hlint = "latest"; # Include the latest hls and hlint in the shell
131 index-state = "2021-02-22T00:00:00Z"; # It is normally best to put this in `cabal.project` (not here)
133# PLUS MANY MORE! Almost any argument you can pass to the project functions
134# or to `shellFor` can be used in as a Hix configuration argument.
139## Adding Nix Support with Niv
141If you have a `nix/hix.nix` file with suitable configuration that
142you want to make available to users with Nix (without having to
145[Niv](https://github.com/nmattia/niv) is a command line tool for keeping track of Nix project dependencies.
147After installing niv you can initialize niv and pin the latest haskell.nix
148commit by running the following in the root directory of the project:
152niv add input-output-hk/haskell.nix -n haskellNix
158(import (import nix/sources.nix).haskellNix {}).hix.project { src = ./.; }
161If you want to also pin `nixpkgs` with Niv use:
165 sources = import nix/sources.nix;
167 (import sources.haskellNix {}).hix.project {
168 inherit (sources) nixpkgs;
179When you want to update to the latest version of haskell.nix use:
185## Adding Nix Flake Support
187To add flake support that uses the `nix/hix.nix` configuration in your
188follow the [Getting started with flakes](getting-started.md) guide, but
189use `haskell-nix.hix.project` instead of `haskell-nix.project'`
191The `nixpkgs` used will need to be selected as a flake input (any selection
192made in `nix/hix.nix` will be ignored).
194Example `flake.nix` file:
198 description = "A very basic flake";
199 inputs.haskellNix.url = "github:input-output-hk/haskell.nix";
200 inputs.nixpkgs.follows = "haskellNix/nixpkgs-unstable";
201 inputs.flake-utils.url = "github:numtide/flake-utils";
202 outputs = { self, nixpkgs, flake-utils, haskellNix }:
203 flake-utils.lib.eachSystem [ "x86_64-linux" "x86_64-darwin" ] (system:
205 overlays = [ haskellNix.overlay
207 # This overlay adds our project to pkgs
209 final.haskell-nix.hix.project {
211 # Other project options can be put in `nix/hix.nix`
215 pkgs = import nixpkgs { inherit system overlays; inherit (haskellNix) config; };
216 flake = pkgs.helloProject.flake {
217 # This adds support for `nix build .#js-unknown-ghcjs:hello:exe:hello`
218 crossPlatforms = p: [p.ghcjs];
221 # Built by `nix build .`
222 defaultPackage = flake.packages."hello:exe:hello";
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list