Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Local Development

Nix shells (or development shells) are extremely powerful when it comes to locally developing with the exact same dependencies used when building packages.

To get started, declare a default devShell in flake.nix using craneLib.devShell and run nix develop in the project directory. Then, you can use something like direnv or nix-direnv to automatically enter and exit a development shell when you enter or exit the project directory!

Sample flake.nix:

{ inputs = { nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable"; crane.url = "github:ipetkov/crane"; flake-utils.url = "github:numtide/flake-utils"; }; outputs = { self, nixpkgs, crane, flake-utils, ... }: flake-utils.lib.eachDefaultSystem (system: let pkgs = nixpkgs.legacyPackages.${system}; craneLib = crane.mkLib pkgs; my-crate = craneLib.buildPackage { src = craneLib.cleanCargoSource ./.; buildInputs = [ # Add additional build inputs here ] ++ pkgs.lib.optionals pkgs.stdenv.isDarwin [ # Additional darwin specific inputs can be set here pkgs.libiconv ]; # Additional environment variables can be set directly # MY_CUSTOM_VAR = "some value"; }; in { packages.default = my-crate; devShells.default = craneLib.devShell { # Additional dev-shell environment variables can be set directly MY_CUSTOM_DEV_URL = "http://localhost:3000"; # Automatically inherit any build inputs from `my-crate` inputsFrom = [ my-crate ]; # Extra inputs (only used for interactive development) # can be added here; cargo and rustc are provided by default. packages = [ pkgs.cargo-audit pkgs.cargo-watch ]; }; }); }

Then, after integrating direnv into your shell:

echo "use flake" > .envrc direnv allow