Hoje em dia temos inúmeras opções para configurar um ambiente de desenvolvimento
que seja facilmente reproduzível e encapsulado. A escolha mais comum tem sido os
contêineresDocker
.
Entretanto, nas minhas pesquisas aventureiras pela internet, descobri uma ferramenta bem
atrativa: oNix
.
Nesta breve série de artigos irei discorrer não só sobre o gerenciador de pacotes mas também mostrar
exemplos de ambientes para desenvolvimento que utilizam as vantagens doNix
!
O que é Nix?
Nix é um gerenciador de pacotes e uma linguagem de programação
funcional-declarativa, preguiçosa (nem sempre), e dinamicamente tipada que usamos
para descrever as _derivações (resultado das expressões emNix
) para esse gerenciador.
Como o gerenciador de pacotes funciona?
A partir de um arquivo que contenha as instruções para construção do pacote, oNix
computa
uma derivação. Para uma derivação ser considerada válida, o arquivo precisa ter as seguintes informações:
- referência para as dependências do pacote a ser construído;
- intruções de como construir o pacote;
- metainformações sobre o pacote, como os mantenedores;
Quando o pacote for construído com sucesso, um caminho será criada com o resultado da construção
no formato:/nix/store/<hash>-<nome>-<versão>
, onde ohash
é criado a partir dos dados da derivação.
Veja o conjunto de expressões Nix que gera a derivação do softwareGNU hello
, por exemplo:
{lib,stdenv,fetchurl}:stdenv.mkDerivationrec{pname="hello";version="2.10";src=fetchurl{url="mirror://gnu/hello/${pname}-${version}.tar.gz";sha256="0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i";};doCheck=true;meta=withlib;{description="A program that produces a familiar, friendly greeting";longDescription='' GNU Hello is a program that prints "Hello, world!" when you run it. It is fully customizable. '';homepage="https://www.gnu.org/software/hello/manual/";changelog="https://git.savannah.gnu.org/cgit/hello.git/plain/NEWS?h=v${version}";license=licenses.gpl3Plus;maintainers=[maintainers.eelco];platforms=platforms.all;};}
Dessa forma oNix
consegue assegurar que a mesma derivação vai sempre construir o mesmo pacote,
a não ser que alguma instrução de construção use informações dependentes de hardware.
Vantagens de usar Nix
Ambiente sempre reproduzível
Essa é a vantagem mais clara da utilização doNix
para gerir pacotes e dependências, pois como
dito anteriormente, se duas pessoas contruirem um pacote com a mesma derivação, as duas terão o mesmo
resultado final. Mesmo que haja uma diferença na versão de alguma dependência, o caminho gerado pela
derivação irá se alterar, explicitando que houve uma mudança.
Múltiplas versões do mesmo pacote simultâneamente
Como cada pacote é instalado em seu próprio caminho, não há colissões. Isso se torna muito atrativo para
desenvolvedores, pois pode ser comparado com os ambientes virtuais dePython
, só que para qualquer programa.
Além disso, como a cada versão construída do pacote gera um novo caminho, há sempre a possibilidade de retornar
à uma versão antiga, desde que ela não tenha sido apagada pelogarbage-collector.
Construções seguras
Toda a contrução de cada derivação é isolada do sistema, o que torna seguro permitir que usuários
com menos privilégios executem suas derivações.
Teste novas ferramentas temporariamente
Digamos que você precisa converter um arquivo escrito comMarkdown
paraHTML
com o pandoc! Porém, você
se lembra que não possui esse programa e precisa usá-lo apenas uma vez.
Naturalmente você possui algumas opções:
- Baixar o programa dos repositórios oficiais, realizar a conversão e desinstalar;
- Usar uma imagem
Docker
do programa, utilizá-la e deixar ela ocupando espaço na sua máquina;
Com oNix
é possível criar um ambiente sob demanda, mas sempre reprodutível, no qual um pacote não
existente no seu sistema passe a ser utilizável.
No caso do pandoc, com um simplesnix-shell -p pandoc
você tem acesso ao pacote de forma temporária!
Ecossistema
Essas vantagens são bem atrativas, mas os casos de uso para oNix
não param por aí. A seguir,
mostro exemplos do mundo real que usamNix
.
Nixpkgs
nixpkgs
é a maior coleção de derivações para o gerenciador de pacotes que podem ser alteradas e combinadas.
Além de derivações específicas para cada linguagem, como um mirror atualizado doHackage
, existem derivações de
diversos outros softwares.
NixOS
Já oNixOS
é uma distribuição GNU/Linux que é configurada a partir de expressõesNix
, além de possuir nativamente
o gerenciador de pacotes. Todo o sistema é tratado como uma grande derivação que depende de todas as outras sub derivações
que você monta.
Neste trecho de exemplo, mostro como habilitar o uso dopulseaudio
noNixOS
:
sound.enable=true;hardware.pulseaudio={enable=true;package=pkgs.pulseaudioFull;};
Esse trecho foi retirado da minhaconfiguração pessoal.
Home Manager
Um projeto muito interessante no ecossistemaNix
é ohome-manager, que permite
gerenciar um ambiente (dotfiles) completo a nível de usuário.
Neste trecho da minha configuração pessoal, declaro alguns pacotes a nível de usuário:
programs={home-manager.enable=true;gpg.enable=true;command-not-found.enable=true;emacs.enable=true;};services.clipmenu.enable=true;services.emacs.enable=true;home.username="matthew";home.homeDirectory="/home/matthew";home.packages=withpkgs;[# barhaskellPackages.xmobar# chattdesktopdiscord# browsergoogle-chrome# themelxappearance# toolsdocker-composeinsomniaqbittorrentobs-studioscreenkeygitAndTools.gh# audiospotify# imagespeekflameshotimagemagick# othersany-nix-shellarandrbitwarden-cli];
Integração com diversas ferramentas
Também é possível usar oNix
para outras tarefas, como descrever a construção de uma imagemDocker
:
{pkgs?import<nixpkgs>{system="x86_64-linux"}}:pkgs.dockerTools.buildLayeredImage{# função para facilitar a construção da imagemname="nix-hello";# nome da imagem a ser construídatag="latest";# tag para a imagemcontents=[pkgs.hello];# pacotes presentes na imagem}
Conclusão
Em suma, oNix
e seu ecossistema é uma boa opção para quem quer ter novas experiências
no mundo Unix, permitindo que um ambiente de desenvolvimento ou até mesmo uma distribuição
GNU/Linux completa possa ser facilmente reproduzida, além de usufruir das vantagens da imutabilidade
de uma linguagem funcional.
Porém, é importante ter em mente que assim como qualquer ferramenta, oNix
não funciona como
"bala de prata". Existem alguns contras que você deve levar em consideração:
- O número de pacotes envelopados, apesar de serem inúmeros, não se comparam (ainda) com os repositóriosoficiais de algumas distribuições, por exemplo.
- Alguns pacotes podem não ser atualizados com frequência.
Fontes e recursos adicionais
- Site oficial para o Nix
- Repositório para nixpkgs
- Post usado como inspiração
- Grupo brasileiro de usuários do NixOS no Telegram
Este post foi publicado com minha ferramenta de linha de comandodevit
!
Você pode encontrar instruções para instalaçãoneste link.
Top comments(4)

- LocationManaus, Amazonas, Brazil
- WorkSoftware Engineer
- Joined
Interessante. Por acaso, você conhece outra solução semelhante? O Nix parece ser excelente e focou em uma solução completa, desde a gestão dos pacotes (NixPkg) até o sistema operacional (NixOS). Pelo que li no site, a instalação do NixOS parece ser tranquila.

- Email
- LocationCampos dos Goytacazes, RJ, Brazil
- EducationComputer Science Student
- WorkFull Stack Developer at Nubank
- Joined
Creio que não... Pelo menos não com o mesmo tamanho do ecossistema Nix. O que mais se aproxima, assim como falei no blog são contêineres Docker e mesmo assim estes são muito diferentes.
Nix (nixpkgs) não é uma linguagem exatamente nova...
Além disso, também existem outros projetos no ecossistema:Nixops
(github.com/NixOS/nixops), que tem a intenção de ser um concorrente direto do Docker, promentendo builds com transparência referencial e estabilidade! Ainda não usei, mas tenho vontade de experimentar.
Há também oflakes
, que deixa as expressões Nix ainda mais declarativas:nixos.wiki/wiki/Flakes

- LocationManaus, Amazonas, Brazil
- WorkSoftware Engineer
- Joined
Gostei muito da proposta do Nix. Vou estudar a tecnologia.
Em uma breve pesquisa, encontrei o projeto Linux Containers da Canonical (linuxcontainers.org/). Ainda não estudei profundamente e nem testei, mas a proposta parece ser muito boa.
Obrigado, Mateus.
For further actions, you may consider blocking this person and/orreporting abuse