Nix Packages

Diferente de gerenciadores tradicionais como apt ou yum, ele trata pacotes como derivations imutáveis armazenadas em /nix/store, permitindo rollback e coexistência segura entre versões.

Cada pacote Nix é construído a partir de uma descrição determinística (derivation), o que permite que ambientes sejam reproduzidos exatamente da mesma forma em qualquer máquina.
Essa abordagem resolve problemas clássicos do desenvolvimento moderno: conflitos de versão, “funciona na minha máquina”, ambientes inconsistentes entre membros do time e pipelines frágeis de CI. Com Nix, é possível declarar todas as dependências de um projeto, como compiladores, runtimes, ferramentas de build, CLIs de cloud e garantir que todos usem exatamente o mesmo conjunto de versões, com lockfile versionado no Git.

Além disso, o Nix permite:

  • Instalar múltiplas versões da mesma ferramenta sem conflito
  • Criar ambientes isolados sem containers
  • Fazer rollback de alterações
  • Utilizar o mesmo modelo tanto para desenvolvimento quanto para CI

Para desenvolvedores, isso significa menos tempo resolvendo problemas de ambiente e mais tempo escrevendo código. O Nix transforma o ambiente de desenvolvimento em parte do código-fonte, tornando-o previsível, versionável e reproduzível; características essenciais para sistemas modernos e equipes distribuídas.


Este artigo apresenta:

  • As diferentes formas de instalar pacotes com Nix
  • As diferenças entre abordagens imperativas e declarativas
  • As vantagens e desvantagens de cada modelo
  • Como usar Nix Flakes em ambiente não-NixOS e sem permissão de root

1. Formas de instalar pacotes com Nix

1.1 nix-env (modo legado, imperativo)

Exemplo:

nix-env -iA nixpkgs.htop

Características

  • Instala no perfil do usuário (~/.nix-profile)
  • Imperativo (modifica o estado atual do ambiente)
  • Interface antiga

Vantagens

  • Simples
  • Rápido para uso imediato

Desvantagens

  • Não declarativo
  • Pouco reprodutível
  • Considerado legado
  • Integração limitada com flakes

Hoje é pouco recomendado para novos ambientes.


1.2 nix profile install (CLI moderna)

Exemplo:

nix profile install nixpkgs#htop

Características

  • Substitui o nix-env
  • Parte da nova CLI (nix-command)
  • Compatível com flakes
  • Ainda imperativo

Vantagens

  • Interface moderna
  • Melhor integração com flake registry
  • Gerenciamento de perfis mais consistente

Desvantagens

  • Continua sendo imperativo
  • Não garante reprodutibilidade entre máquinas

Indicado para instalar ferramentas pessoais permanentes.


1.3 nix shell (ambiente temporário)

Exemplo:

nix shell nixpkgs#nodejs

Características

  • Ambiente temporário
  • Não instala permanentemente
  • Não altera estado do sistema

Vantagens

  • Ideal para testes rápidos
  • Não polui o perfil do usuário
  • Útil em pipelines e scripts

Desvantagens

  • Não persiste
  • Sem flake, depende do canal local

1.4 shell.nix (ambiente declarativo por projeto)

Exemplo:

{ pkgs ? import <nixpkgs> {} }:
pkgs.mkShell {
  buildInputs = [
    pkgs.nodejs
    pkgs.rustc
  ];
}

Entrar no ambiente:

nix-shell

Características

  • Declarativo
  • Versionável via Git
  • Baseado em canais

Vantagens

  • Ambiente reproduzível dentro do projeto
  • Simples de compartilhar

Desvantagens

  • Depende do canal <nixpkgs>
  • Pode variar entre máquinas

Foi o modelo mais comum antes de flakes.


1.5 Flakes (flake.nix) - modelo moderno

Exemplo:

{
  description = "Dev environment";

  inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";

  outputs = { self, nixpkgs }:
  let
    system = "x86_64-linux";
    pkgs = import nixpkgs { inherit system; };
  in {
    devShells.${system}.default = pkgs.mkShell {
      buildInputs = [
        pkgs.rustc
        pkgs.cargo
      ];
    };
  };
}

Entrar no ambiente:

nix develop

Características

  • Declarativo
  • Possui lockfile (flake.lock)
  • Totalmente versionável
  • Independente de canais globais

Vantagens

  • Reprodutibilidade forte
  • Controle explícito da versão do nixpkgs
  • Ideal para equipes e CI

Desvantagens

  • Curva de aprendizado maior
  • Sintaxe mais estruturada
  • Ainda marcado como experimental (embora amplamente adotado)

1.6 NixOS (configuração do sistema)

No arquivo /etc/nixos/configuration.nix:

environment.systemPackages = with pkgs; [
  vim
  git
  htop
];

Aplicação:

sudo nixos-rebuild switch

Características

  • Declarativo
  • Sistema inteiro configurado via Nix
  • Rollback completo

Vantagens

  • Reprodutibilidade total
  • Versionamento do sistema
  • Excelente para servidores

Desvantagens

  • Funciona apenas em NixOS
  • Mudança de paradigma significativa

2. Comparação resumida

MétodoDeclarativoPersistenteReprodutívelUso típico
nix-envNãoSimNãoLegado
nix profileNãoSimNãoFerramentas pessoais
nix shellNãoNãoParcialTestes rápidos
shell.nixSimNãoMédioProjeto tradicional
FlakesSimOpcionalAltoProjetos modernos
NixOS configurationSimSimMuito altoSistema inteiro

3. Usando Nix Flakes fora do NixOS e sem root

Uma das maiores vantagens do Nix é poder utilizá-lo sem permissões administrativas.

3.1 Instalação single-user

O modo single-user não requer root:

sh <(curl -L https://nixos.org/nix/install) --no-daemon

Instalação típica:

  • ~/.nix-profile
  • ~/.nix-defexpr
  • /nix/store (criado no processo)

3.2 Ativando flakes

Edite:

~/.config/nix/nix.conf

Adicione:

experimental-features = nix-command flakes

3.3 Criando um projeto com flakes

Estrutura:

meu-projeto/
 ├── flake.nix

Exemplo:

{
  description = "Dev environment";

  inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";

  outputs = { self, nixpkgs }:
  let
    system = "x86_64-linux";
    pkgs = import nixpkgs { inherit system; };
  in {
    devShells.${system}.default = pkgs.mkShell {
      buildInputs = [
        pkgs.git
        pkgs.nodejs
        pkgs.rustc
        pkgs.cargo
      ];
    };
  };
}

Entrar no ambiente:

nix develop

Na primeira execução será criado o arquivo:

flake.lock

Esse lockfile fixa a versão do nixpkgs, garantindo reprodutibilidade total.


3.4 Executando pacotes sem instalar

nix run nixpkgs#htop

Nenhuma instalação permanente é feita.


4. Vantagens do uso sem root

  • Não altera /usr/bin
  • Funciona em ambientes corporativos restritos
  • Ideal para CI
  • Pode coexistir com apt/yum
  • Não requer Docker para isolamento de ferramentas
  • Versionamento explícito das dependências

5. Limitações nesse modelo

  • Não gerencia serviços do sistema
  • Não substitui systemd
  • Não instala pacotes globais do sistema
  • Primeiro download pode ser pesado

6. Quando usar cada abordagem

Use nix profile quando:

  • Precisa de ferramentas permanentes no seu usuário

Use nix shell quando:

  • Quer testar algo rapidamente

Use Flakes quando:

  • Precisa de reprodutibilidade
  • Trabalha em equipe
  • Quer versionar ambiente de desenvolvimento
  • Quer integração confiável com CI

Use NixOS quando:

  • Deseja declarar o sistema inteiro como código

Conclusão

O Nix oferece múltiplos níveis de controle, desde instalação imperativa simples até ambientes totalmente declarativos e reproduzíveis.

Para desenvolvimento moderno, especialmente em ambientes multi-linguagem ou com necessidade de controle de versões exatas (Rust, Java, Node, ferramentas de cloud), Flakes representam o modelo mais robusto.

Mesmo fora do NixOS e sem permissões de root, é possível obter:

  • Isolamento forte
  • Reprodutibilidade
  • Versionamento explícito
  • Ambientes compartilháveis via Git

Isso torna o Nix uma alternativa extremamente poderosa a containers para ambientes de desenvolvimento e integração contínua.


Por hoje é isto ...

Artus