Nix é mais do que um gerenciador de dependências, também é uma linguagem, que por sua vez se torna um gerenciador de “ambientes reprodutíveis”.

Neste post vou mostrar somente como usar como um gerenciador de dependências.

Meu desktop é um Arch Linux, consegui instalar e gerenciar o Nix sem qualquer problema. Para escrever esse post eu instalei Ubuntu numa máquina virtual, e tudo ocorreu do mesmo jeito.

Instalar o Nix

Se você é tal qual eu e não gosta de ver shell scripts perguntando senha, use este comando primeiro:

$ sudo mkdir /nix
$ sudo chown $(id -u):$(id -u) /nix

Feche seu terminal e abra novamente, execute um comando como sudo ls para ter certeza que seu terminal está pedindo senha, mas não digite.

Neste novo terminal execute esse comando para instalar o Nix:

$ curl https://nixos.org/nix/install | sh

Tudo que precisa será instalado em /nix e com links em ~/.nix-profile.

NOTA: Também existem ~/.nix-channels e ~/.nix-defexpr/, mas para este post nós não faremos nada com eles 😉.

Finalmente, para ativar você precisa disso:

. ~/.nix-profile/etc/profile.d/nix.sh

Rode no mesmo terminal ou adicione no seu ~/.profile.

Teste Antes de Instalar

É possível instalar pacotes, mas o mais legal é testar antes de instalar:

$ nix-shell -p hello

Nix vai baixar e preparar um shell para você com tudo instalado. Ao final do teste é só sair com exit e o pacote com as dependências será removido do seu shell, exemplo:

$ nix-shell -p hello
[nix-shell:~]$ hello
Hello, world!

[nix-shell:~]$ exit
$ hello
zsh: command not found: hello

Instalar Pacotes

Se você quiser instalar algo, use este comando:

$ nix-env -i hello

Nota: O Nix faz cache. A segunda vez que você roda um comando (por exemplo, nix-env -p hello) você vai notar que tem menos saída no terminal, é justamente por causa disso.

Gerações - Generations

A cada nova instalação o Nix muda a generation que você está.

Para desfazer algo, claro, é possível desinstalar OU fazer rollback para a generation passada (ou qualquer outra) e apagar a que você estava.

Assumindo que você rodou apenas nix-env -i hello você terá duas generations:

$ nix-env --list-generations
   1   2020-05-16 17:55:13
   2   2020-05-16 18:33:29   (current)

Se você digitar hello o comando estará lá. Agora desfaça com --rollback:

dmitry@dmitry-VirtualBox:~$ nix-env --rollback
switching from generation 2 to 1

Tente chamar hello novamente. O comando não estará lá.

Verifique novamente as generations and você tem. Agora tem duas e você está de volta na primeira:

$ nix-env --list-generations
   1   2020-05-16 17:55:13   (current)
   2   2020-05-16 18:33:29

Para apagar uma generation faça isso:

$ nix-env --delete-generations 2
removing generation 2

Depois disso só exite uma:

$ nix-env --list-generations
   1   2020-05-16 17:55:13   (current)

Se precisar voltar para uma generation em particular use isto:

$ nix-env -G 3

Aquele parâmetro é chamado --delete-generations pois é possível apagar mais de uma ao mesmo tempo:

$ nix-env --delete-generations 2 3

Desinstalar Pacotes

$ nix-env -e hello

Desinstalar um pacote também cria uma generation.

Listar o que Está Instalado

$ nix-env -q

Esse comando lista apenas o que foi instalado com um comando tipo nix-env -i pkg, ou seja, sem as dependências daquela instalação. É o equivalente a pacman -Qe.

Procurar por Pacotes

Eu prefiro ir em https://nixos.org/nixos/packages.html para procurar algo.

Para listar todos os pacotes que é possível instalar:

$ nix-env -qa

Para pesquisar você pode rodar algum desses:

$ nix-env -qa 'bash'
bash-4.4-p23
bash-5.0-p16
$ nix-env -qa 'bash.*'
bash-4.4-p23
bash-5.0-p16
bash-completion-2.10
bash-completion-2.10
bash-interactive-4.4-p23
bash-interactive-5.0-p16
bash-my-aws-20200111
bash-supergenpass-unstable-2018-04-18
bashburn-3.1.0
bashdb-4.4-1.0.0
bashmount-3.2.0
bashplotlib-2019-01-02
bashSnippets-1.23.0
bash_unit-1.7.1

Remover o Nix

Apague /nix e aqueles outros três diretórios:

  • /nix
  • ~/.nix-profile
  • ~/.nix-channels
  • ~/.nix-defexpr/