cabal2nix manuallynix-shell --packages cabal2nix --run "cabal2nix ." > default.nixThis will create a default.nix file that will look somewhat like this:
{ mkDerivation, base, stdenv }:
mkDerivation {
pname = "yourCabalProjectName";
version = "0.1.0";
src = ./.;
isLibrary = false;
isExecutable = true;
executableHaskellDepends = [ base ];
license = "unknown";
hydraPlatforms = stdenv.lib.platforms.none;
}Now create release.nix file with the following contents:
let
pkgs = import <nixpkgs> {};
in
pkgs.haskellPackages.callPackage ./default.nix { }Now you can do nix-build release.nix to compile your project using Cabal.
Note: This method will require to re-generate default.nix every time you change your Cabal project file. If you don't want to do this, use the method described in the next section.
Create default.nix file with the following content:
{ pkgs ? import <nixpkgs> {} }:
let
haskellPackages = pkgs.haskellPackages.override (old: {
overrides = pkgs.lib.composeExtensions (old.overrides or (_: _: { }))
(self: super: {
project = haskellPackages.callCabal2nix "chat" ./. {};
# Additional overrides go here.
});
});
in {
project = haskellPackages.project;
haskellPackages = haskellPackages;
pkgs = pkgs;
}Note: See the relations between nixpkgs versions and GHC versions here: https://tldr.brick.do/eb0cd436-b62b-427d-be2c-8e3dc0087ed2
If you want to pin pkgs version to a released nixpkgs version, e.g. 20.09, do the following (replace nixos-20.09 with master if you just want the latest nixpkgs):
git ls-remote https://github.com/nixos/nixpkgs nixos-20.09This will give you the following output:
e065200fc90175a8f6e50e76ef10a48786126e1c refs/heads/nixos-20.09Where e065200fc90175a8f6e50e76ef10a48786126e1c is your revison hash. Now modify your default.nix file so it looks like this:
{ pkgs ? import (builtins.fetchGit {
name = "nixos-20.09-2020-12-29";
url = "https://github.com/nixos/nixpkgs";
ref = "refs/heads/nixos-20.09";
rev = "e065200fc90175a8f6e50e76ef10a48786126e1c";
}) {} }:
let
haskellPackages = pkgs.haskellPackages.override (old: {
overrides = pkgs.lib.composeExtensions (old.overrides or (_: _: { }))
(self: super: {
project = haskellPackages.callCabal2nix "chat" ./. {};
# Additional overrides go here.
});
});
in {
project = haskellPackages.project;
haskellPackages = haskellPackages;
pkgs = pkgs;
}That's it. By the way, you can omit ref if it's refs/heads/master.
Just put the following code snippet into a shell.nix file to enable cabal-install, haskell-language-server and ormolu when running nix-shell:
let
release = import ./release.nix;
shell = with release; with release.pkgs; haskellPackages.shellFor {
# withHoogle = true;
packages = p: [project];
buildInputs = with haskellPackages; [
ormolu
haskell-language-server
cabal-install
];
};
in
if release.pkgs.lib.inNixShell then shell else release.projectNote: withHoogle = true is currently commented because of a bug in nixpkgs.
Once you've configured Nix shell with haskell-language-server, just open VS Code inside Nix shell:
nix-shell
code .TODO
$PATH with direnvSupposing direnv is already installed, do the following in your project root:
direnv allow .
echo "PATH_add result/bin" > .envrcThat's it!
TODO: what use nix does?
TODO
Note: You can't build Docker images with Nix on macOS natively, to do that you'll have to create a Docker container (via a simple Dockerfile, not via Nix) and then inside it build a Docker image with Nix.
TODO