wiki/structured/tools.nix.org
Gabriel Arazas 3e5d089707 Add notes on various programs and Udacity program
Mainly on the SUSE cloud native fundamentals scholarship program from
Udacity along with various CLI programs I learnt to use over the days
trying to complete it piecewise...

Offhand comment, it is pretty nice so far.
2021-06-13 12:20:18 +08:00

3.0 KiB

The basics of Nix package manager

Nix package manager is a great tool for reproducibility as you can easily set up your environment. Taking it up to the next level with NixOS, your whole installation.

Ecosystem

  • Nix has tools to make setting up environments easier with direnv, lorri, and Niv

You can create a reproducible executable that only requires Nix.

#!/usr/bin/env nix-shell
#! nix-shell --pure -i bash -p curl jq fzf findutils

# A quick command line interface for creating a gitignore with the API from https://gitignore.io.
# This script comes with a simple caching to avoid creating too much requests.

set -eo pipefail

CACHE_FILE="${XDG_CACHE_DIR:-$HOME/.cache}/gitignore-io.langs.json"

# Check if the language list is downloaded for the last hour (3600 seconds).
if [ ! -e $CACHE_FILE ] || test $(expr $(date "+%s") - $(date -r $CACHE_FILE "+%s")) -gt 3600
then
    ping "gitignore.io" --count 4 && curl --silent --location --output $CACHE_FILE "https://gitignore.io/api/list?format=json"
fi

KEYS=$(jq 'keys | .[] | @text' --raw-output $CACHE_FILE | fzf --multi | while read lang; do echo " .[\"$lang\"].contents"; done | paste -s -d ',')

jq "$KEYS" --raw-output $CACHE_FILE

Components of the package manager

Holistically, Nix is made up of at least four components: the store, the language, the derivations, and the sandbox.

  • The store is a immutable centralized location where all of the outputs are placed.
  • The derivations are essentially build instructions.
  • The language (also called as Nix but we'll refer to it as Nixlang) is a domain-specific language for creating derivations.
  • The build process can be locked in a sandbox, improving the reproducibility of a setup and lowering the attack surface for a malicious package.

Overlays

You can override values in Nix as a way to customize nixpkgs. For example, if you want to use a different version from the nixpkgs channel, you can change the appropriate value.

let overlay = self: super:
      {
        ncmpcpp = super.ncmpcpp.override { visualizerSupport = true; };
      }

For another example, you can see some examples from Neovim (which also uses Nix flakes).

You can set overlays automatically either by setting nixpkgs.overlays from your system configuration or ~/.config/nixpkgs/overlays/ folder for user-specific settings. You could also set overlays for standalone Nix code similarly through the overlays key — e.g., import <nixpkgs> ? { overlays = (self: super: { } ); };.