Como usar o Devbox para ambientes de desenvolvimento reproduzíveis sem Docker

1. Introdução ao Devbox: Por que substituir o Docker?

O Docker revolucionou o desenvolvimento de software ao oferecer ambientes isolados e reproduzíveis, mas sua adoção em estações de trabalho locais frequentemente gera complexidade desnecessária. Configurar volumes, gerenciar permissões, lidar com desempenho em macOS/Windows e manter múltiplos containers em execução consome tempo e recursos preciosos dos desenvolvedores.

O Devbox surge como uma alternativa elegante: ele cria shells isolados com todas as dependências necessárias sem exigir containers ou virtualização. Utilizando o Nix Package Manager por baixo dos panos, o Devbox oferece ambientes de desenvolvimento reproduzíveis que funcionam em qualquer sistema operacional Linux, macOS ou Windows (via WSL2) com overhead mínimo.

A proposta central é simples: você define as ferramentas que seu projeto precisa em um arquivo JSON, e o Devbox garante que todos na equipe tenham exatamente as mesmas versões, sem conflitos com as ferramentas já instaladas no sistema.

2. Instalação e configuração inicial do Devbox

A instalação é direta. No macOS ou Linux, execute:

curl -fsSL https://get.jetify.com/devbox | bash

No Windows, utilize WSL2 e siga o mesmo comando. Alternativamente, via gerenciadores de pacotes:

# macOS (Homebrew)
brew install devbox

# Linux (via apt)
sudo apt install devbox

Após instalar, crie seu primeiro ambiente:

mkdir meu-projeto && cd meu-projeto
devbox init

Isso gera um arquivo devbox.json com a estrutura inicial:

{
  "packages": [],
  "shell": {
    "init_hook": [],
    "scripts": {}
  }
}

Para entrar no shell isolado:

devbox shell

Para executar um comando sem entrar no shell:

devbox run -- "node --version"

3. Gerenciamento de dependências com Devbox

Adicionar ferramentas ao ambiente é intuitivo. Vamos configurar um projeto Node.js com Python e utilitários comuns:

devbox add node@18 python@3.11 git curl

O arquivo devbox.json será atualizado automaticamente:

{
  "packages": [
    "node@18",
    "python@311",
    "git",
    "curl"
  ],
  "shell": {
    "init_hook": [],
    "scripts": {}
  }
}

O Devbox permite controle granular de versões. Para versões específicas:

devbox add "node@18.17.0"
devbox add "python@3.11.5"

Dependências globais (instaladas no sistema) e locais (por projeto) coexistem sem conflitos. O Devbox gerencia o PATH automaticamente, priorizando as versões do projeto.

4. Criando ambientes de desenvolvimento reproduzíveis

O verdadeiro poder do Devbox está na reprodução consistente entre máquinas. O arquivo devbox.json e o devbox.lock (gerado automaticamente) devem ser versionados no Git.

Exemplo de devbox.json completo para um projeto web:

{
  "packages": [
    "node@18",
    "yarn@1.22",
    "postgresql@15",
    "redis@7"
  ],
  "env": {
    "DATABASE_URL": "postgres://localhost:5432/meubanco",
    "REDIS_URL": "redis://localhost:6379"
  },
  "shell": {
    "init_hook": [
      "echo 'Ambiente Devbox iniciado'",
      "yarn install"
    ],
    "scripts": {
      "dev": "yarn dev",
      "test": "yarn test",
      "db:migrate": "yarn prisma migrate dev"
    }
  }
}

Quando um novo membro da equipe clonar o repositório, basta executar:

devbox shell

Todas as dependências serão baixadas e configuradas automaticamente, garantindo que todos trabalhem com as mesmas versões.

5. Hooks e scripts de automação no Devbox

Os hooks permitem executar comandos automaticamente ao iniciar o shell. O init_hook executa uma vez na criação do ambiente, enquanto shell_hook executa toda vez que o shell é iniciado:

{
  "packages": ["node@18", "python@3.11"],
  "shell": {
    "init_hook": [
      "npm install",
      "pip install -r requirements.txt"
    ],
    "shell_hook": [
      "echo 'Bem-vindo ao projeto!'",
      "export PROJECT_ENV=development"
    ],
    "scripts": {
      "start": "node server.js",
      "lint": "eslint .",
      "test": "jest"
    }
  }
}

Para executar scripts personalizados:

devbox run start
devbox run test

Isso substitui a necessidade de Makefile ou scripts npm complexos, centralizando toda a configuração do ambiente.

6. Integração com editores e IDEs

O Devbox se integra nativamente com VS Code através do Dev Containers. Crie um arquivo .devcontainer/devcontainer.json:

{
  "image": "mcr.microsoft.com/devcontainers/base:ubuntu",
  "features": {
    "ghcr.io/devcontainers/features/devbox:1": {}
  },
  "postCreateCommand": "devbox shell"
}

Para editores como IntelliJ, Vim ou Neovim, basta configurar o terminal integrado para iniciar automaticamente o devbox shell. Exemplo para .bashrc:

if [ -f "$PWD/devbox.json" ]; then
  exec devbox shell
fi

No Vim, adicione ao .vimrc:

autocmd VimEnter * if filereadable('devbox.json') | terminal devbox shell | endif

7. Comparação com Docker e casos de uso avançados

Característica Devbox Docker
Overhead Mínimo (apenas shell) Médio (container)
Inicialização Instantânea Segundos/minutos
Compartilhamento devbox.json + devbox.lock Dockerfile + docker-compose.yml
Isolamento PATH e variáveis Namespaces do kernel
Portabilidade Qualquer SO com Nix Requer Docker Engine

Caso prático: projeto Python com dependências específicas:

# devbox.json
{
  "packages": [
    "python@3.10",
    "poetry",
    "postgresql@14"
  ],
  "shell": {
    "init_hook": ["poetry install"],
    "scripts": {
      "dev": "uvicorn app.main:app --reload",
      "migrate": "alembic upgrade head"
    }
  }
}

Para Node.js:

{
  "packages": ["node@20", "yarn@1.22", "typescript"],
  "shell": {
    "init_hook": ["yarn install"],
    "scripts": {
      "build": "tsc",
      "start": "node dist/index.js"
    }
  }
}

Para Go:

{
  "packages": ["go@1.21", "golangci-lint", "protobuf"],
  "shell": {
    "scripts": {
      "build": "go build -o bin/app",
      "test": "go test ./..."
    }
  }
}

8. Boas práticas e resolução de problemas comuns

Versionamento: Sempre commite devbox.json e devbox.lock. Use devbox update para atualizar dependências.

Debug de conflitos: Se uma dependência falhar, use devbox shell --pure para iniciar sem hooks e diagnosticar.

Limpeza: Remova shells órfãos com devbox clean e gerencie múltiplos projetos com devbox projects list.

Cache local: O Nix armazena pacotes em /nix/store. Para liberar espaço, use nix-collect-garbage.

Ambientes complexos: Para projetos que exigem serviços como bancos de dados, combine Devbox com Docker Compose apenas para os serviços, mantendo o ambiente de desenvolvimento local.

O Devbox representa uma evolução natural na busca por ambientes de desenvolvimento reproduzíveis, oferecendo a simplicidade de um gerenciador de pacotes com o poder do Nix, sem a complexidade dos containers. Para equipes que buscam produtividade sem abrir mão da consistência, é uma ferramenta indispensável no arsenal moderno de desenvolvimento.

Referências