# 📚 Guia de Migração: Pip → UV

## Resumo Executivo

UV é um gerenciador de pacotes Python **ultra-moderno** escrito em Rust que oferece:

- ⚡ **10-100x mais rápido** que pip
- 🔒 **Lock file seguro** (uv.lock) para versões determinísticas
- 🐍 **Gerenciamento nativo** de versões Python
- 📦 **Padrão moderno**: PEP 517/518 (pyproject.toml)
- 🎯 **100% compatível** com pip e requirements.txt

---

## Comparação: Pip vs UV

### 1. **Instalação de Dependências**

#### Com Pip (Antigo)
```bash
# 1. Criar ambiente virtual
python -m venv .venv

# 2. Ativar (Windows)
.\.venv\Scripts\Activate.ps1

# 3. Instalar
pip install -r requirements.txt

# ⏱️  Tempo: ~15-30 segundos
```

#### Com UV (Moderno)
```bash
# 1. Sync automático (tudo em 1 comando!)
uv sync

# ⏱️  Tempo: ~1-3 segundos (10-20x mais rápido!)
```

### 2. **Estrutura de Arquivos**

#### Antes (Pip)
```
projeto/
├── setup.py              # Build script antigo
├── requirements.txt      # Dependências sem lock
├── requirements-dev.txt  # Dev deps
└── .venv/              # Ambiente virtual
```

#### Depois (UV + Modern Python)
```
projeto/
├── pyproject.toml       # Configuração moderna (PEP 517/518)
├── uv.lock             # Lock file determinístico
├── requirements.txt    # OPCIONAL (compatibilidade)
├── setup.py           # OPCIONAL (compatibilidade)
└── .venv/             # Ambiente virtual
```

### 3. **Adicionar Dependência**

#### Pip
```bash
pip install novo-pacote
# ⚠️  Não atualiza requirements.txt automaticamente
# Precisa fazer manualmente:
pip freeze > requirements.txt
```

#### UV
```bash
uv add novo-pacote
# ✅ Atualiza automaticamente pyproject.toml + uv.lock
```

### 4. **Remover Dependência**

#### Pip
```bash
pip uninstall novo-pacote
pip freeze > requirements.txt
# ⚠️  Manual e propenso a erros
```

#### UV
```bash
uv remove novo-pacote
# ✅ Automático
```

### 5. **Lock File**

#### Pip
```
❌ Não há lock file padrão
❌ Versões podem variar entre máquinas
❌ pip freeze cria lista, mas não é confiável
```

#### UV
```
✅ uv.lock cria lock file determinístico
✅ Versões garantidas em todas as máquinas
✅ Compatível com git (versionável)
```

### 6. **Execução de Scripts**

#### Pip
```bash
# Precisa ativar manualmente
source .venv/bin/activate  # Linux/Mac
.\.venv\Scripts\Activate.ps1  # Windows

python script.py
```

#### UV
```bash
# Executa diretamente (sem ativar!)
uv run python script.py
```

### 7. **Gerenciar Versões Python**

#### Pip
```bash
# ❌ Não gerencia Python
# Precisa de pyenv ou manual
pyenv install 3.11
pyenv local 3.11
python -m venv .venv
```

#### UV
```bash
# ✅ Gerencia automaticamente
uv python install 3.11
uv sync --python 3.11
```

---

## Tabela Comparativa Detalhada

| Característica | Pip | UV |
|---|---|---|
| **Velocidade** | ~15-30s | ~1-3s | 10-20x |
| **Lock file** | ❌ | ✅ uv.lock |
| **Determinístico** | ❌ | ✅ |
| **Python nativo** | ❌ | ✅ |
| **Cache paralelo** | ❌ | ✅ |
| **Padrão moderno** | ❌ | ✅ PEP 517/518 |
| **Suporte pip** | ✅ | ✅ |
| **Workspace** | ❌ | ✅ (Monorepo) |
| **Performance cache** | Médio | Excelente |
| **Comunidade** | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |

---

## Instalação do UV

### Windows (PowerShell)

```powershell
# Opção 1: WinGet (Recomendado)
winget install astral-sh.uv

# Opção 2: Python (Fallback)
pip install uv

# Verificar
uv --version
```

### macOS

```bash
# Opção 1: Homebrew (Recomendado)
brew install uv

# Opção 2: Curl
curl -LsSf https://astral.sh/uv/install.sh | sh

# Opção 3: Python
pip install uv
```

### Linux

```bash
# Opção 1: Curl (Recomendado)
curl -LsSf https://astral.sh/uv/install.sh | sh

# Opção 2: Package Manager (APT, YUM, etc)
# https://docs.astral.sh/uv/guides/installation/

# Opção 3: Python
pip install uv
```

---

## Migrando um Projeto Existente

### Passo 1: Entender Estrutura Atual

```bash
# Ver dependências atuais
cat requirements.txt
cat requirements-dev.txt  # Se existir
```

### Passo 2: Instalar UV

```bash
# Windows
winget install astral-sh.uv

# macOS
brew install uv

# Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
```

### Passo 3: Criar pyproject.toml

```toml
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[project]
name = "meu-projeto"
version = "1.0.0"
requires-python = ">=3.8"
dependencies = [
    "requests>=2.25.0",
    "python-dotenv>=0.19.0",
]

[project.optional-dependencies]
dev = [
    "pytest>=7.4.0",
    "pytest-cov>=4.1.0",
]
```

### Passo 4: Migrar Dependências

```bash
# Opção A: Manual (mais controle)
# Copie dados de requirements.txt para pyproject.toml

# Opção B: Automático com UV
uv pip compile requirements.txt -o requirements-compiled.txt
# Depois copie para pyproject.toml

# Opção C: Do zero (recomendado)
uv sync  # UV irá ler requirements.txt e criar pyproject.toml
```

### Passo 5: Sincronizar

```bash
# Cria .venv e instala tudo
uv sync

# Instala apenas prod (sem dev)
uv sync --no-dev

# Com grupo específico
uv sync --group dev
```

### Passo 6: Atualizar Scripts

**Antes:**
```bash
source .venv/bin/activate
python script.py
```

**Depois:**
```bash
uv run python script.py
```

### Passo 7: Committar Mudanças

```bash
git add pyproject.toml uv.lock
git remove setup.py requirements.txt  # Opcionais agora
git commit -m "chore: migrate to uv package manager"
```

---

## Comandos UV Essenciais

### Instalação e Sync

```bash
uv sync                    # Instala tudo
uv sync --no-dev          # Sem dev dependencies
uv sync --refresh         # Ignora cache
uv sync --python 3.11     # Com Python específico
```

### Gerenciar Pacotes

```bash
uv add requests            # Adiciona dependência
uv add -d pytest           # Adiciona dev dependency
uv remove requests         # Remove dependência
uv pip install requests    # Compatibilidade pip
uv pip show requests       # Info do pacote
```

### Executar Código

```bash
uv run python script.py    # Executa script
uv run pytest             # Roda testes
uv run python -c "..."    # Executa comando
uv run --help             # Ajuda
```

### Ambientes Virtuais

```bash
uv venv                    # Cria .venv
uv venv --python 3.11     # Com Python específico
source .venv/bin/activate # Ativa (Linux/Mac)
.\.venv\Scripts\Activate.ps1 # Ativa (Windows)
```

### Python

```bash
uv python list            # Versões disponíveis
uv python install 3.11    # Instala versão
uv python find 3.11       # Encontra versão
```

### Limpeza

```bash
uv cache clean            # Limpa cache local
uv cache prune            # Remove entradas antigas
```

---

## FAQ - Migração Pip → UV

### P: Preciso desinstalar pip?
**R:** Não! UV é compatível com pip. Você pode usar ambos.

### P: Como faço rollback para pip?
**R:** UV cria um `pyproject.toml` padrão que pip consegue ler:
```bash
pip install .
pip install -e .
```

### P: Meu projeto usa setup.py, devo manter?
**R:** Não é obrigatório. `pyproject.toml` é o padrão moderno. Mas pip ainda lê `setup.py`, então é seguro depreciar gradualmente.

### P: Como faço versionamento de dependências com UV?
**R:** UV gera `uv.lock` automaticamente com versions pinadas. Versione-o no git como qualquer arquivo.

### P: Posso usar diferentes versões Python?
**R:** Sim! UV gerencia versões Python nativamente:
```bash
uv sync --python 3.10
uv sync --python 3.11
```

### P: Como integro com CI/CD?
**R:** GitHub Actions:
```yaml
- uses: astral-sh/setup-uv@v1
- run: uv sync
- run: uv run pytest
```

### P: Qual a vantagem do uv.lock?
**R:** Garante que em todas as máquinas (dev, CI, produção) as versões sejam exatamente as mesmas.

### P: UV suporta extras/optional dependencies?
**R:** Sim!
```toml
[project.optional-dependencies]
dev = ["pytest"]
docs = ["sphinx"]
```

```bash
uv sync --group dev
uv add "pacote[extra]"
```

---

## Próximas Leituras

- 📖 [Documentação Oficial UV](https://docs.astral.sh/uv/)
- 📖 [PEP 517 - Build System Interface](https://peps.python.org/pep-0517/)
- 📖 [PEP 518 - pyproject.toml](https://peps.python.org/pep-0518/)
- 📖 [Guia UV do Mangaba AI](UV_SETUP.md)

---

## Checklist de Migração

- [ ] Instalar UV
- [ ] Criar `pyproject.toml`
- [ ] Executar `uv sync`
- [ ] Testar instalação (`uv run python script.py`)
- [ ] Gerar `uv.lock`
- [ ] Atualizar CI/CD
- [ ] Committar `pyproject.toml` + `uv.lock`
- [ ] Atualizar documentação
- [ ] Comunicar à equipe
- [ ] Opcional: Remover `setup.py` e `requirements.txt`

---

**Bem-vindo ao futuro do Python! 🚀**
