Nix es entre varias cosas un gestor de paquetes que mantiene separacion entre las dependencias de cada proyecto sin interferir con el sistema de la PC directamente mediante la gestion de diferentes sources configurados mediante links simbolicos al sistema principal.
Podemos compararlo con Homebrew el cual es el gestor de paquetes mas comunmente usado en MacOS, la mayor diferencia es que mientras que brew instala las dependencias dentro de una carpeta propia del disco del sistema principal, nix maneja todas las dependencias requeridas dentro de un volumen de disco logico completamente aparte del sistema de archivos principal de la PC.
Para instalarlo en Mac se debe ejecutar el siguiente instalador:
curl -L https://nixos.org/nix/install | sh
Con este script ya ejecutado, y habiendo terminado la instalacion debemos conocer 2 conceptos mas dentro del mundo
de Nix: flakes
y home-manager
.
Flakes es un feature aun considerado experimental dentro del ecosistema de Nix, sin embargo es basicamente la forma actual en la cual las configuraciones que nosotros generemos seran creadas. Por compararlo con podrimos decir que es similar al funcionamiento de NPM donde tenemos un archivo de definicion de dependencias y configuraciones y un archivo de lock que nos sirve para guardar cual es la especificacion de la instalacion actual para guardar consistencia.
HomeManager es una extension dentro de Nix la cual en conjunto con Flakes nos ayuda a separar nuestros ambientes y configuraciones en 2 grupos, globales y particulares, donde siempre estaremos cargando una configuracion global por defecto.
Crea el archivo ~/.config/nix/nix.conf
con el siguiente contenido para activar el feature de flakes dentro de nix:
experimental-features = nix-command flakes
Despues agregaremos el channel de home-manager a los sources de Nix:
nix-channel --add https://github.com/nix-community/home-manager/archive/master.tar.gz home-manager
# Este comando puede tomar varios minutos en completarse
nix-channel --update -v
# Esto seria similar a ejecutar `brew tap <source> && brew update`
Despues instalaremos como tal el paquete home-manager:
nix-shell '<home-manager>' -A install
# similar a `brew install <package>`
Despues agregaremos una configuracion para que Nix pueda instalar paquetes con licencias que no son de uso libre, por ejemplo terraform:
echo "{ allowUnfree = true; }" >> ~/.config/nixpkgs/config.nix
Ahora crearemos los archivos de configuracion base y ejecutaremos esa configuracion con el siguiente comando:
nix run home-manager/master -- init --switch
Este comando creara los siguientes archivos:
~/.config/home-manager
├── flake.lock
├── flake.nix
└── home.nix
El archivo flake.nix es el que nos servira para importar los diferentes modulos de paquetes que definamos segun nuestras preferencias, asi como tambien nos ayudara a generar perfiles de configuracion diferentes y asi aislar programas que no son requeridos en cada perfil.
El archivo home.nix es el archivo de configuracion global a nuestra PC, en este deberemos de definir solo las dependencias que nosotros querramos sean incluidas en cada perfil de configuracion por defecto. Tambien dentro de este archivo es donde podremos crear scripts de activacion que nos serviran para terminar de configurar nuestras herramientas de ser necesario despues de su instalacion (eg: crear variables de entorno, crear carpetas, crear archivos, etc.).
El archivo flake.lock es un archivo que nos sirve como hash de versiones de los paquetes que estamos usando en nuestra configuracion, similar a lo que seria un archivo package-lock.json para npm o un archivo go.sum para Go. Este archivo es creado la primera vez que inicializamos y usamos un perfil usando Nix y home-manager.