
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étodo | Declarativo | Persistente | Reprodutível | Uso típico |
|---|---|---|---|---|
| nix-env | Não | Sim | Não | Legado |
| nix profile | Não | Sim | Não | Ferramentas pessoais |
| nix shell | Não | Não | Parcial | Testes rápidos |
| shell.nix | Sim | Não | Médio | Projeto tradicional |
| Flakes | Sim | Opcional | Alto | Projetos modernos |
| NixOS configuration | Sim | Sim | Muito alto | Sistema 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