Nix Como um Gerenciador de Dependências
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 -L 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/