DNATech :: 🕵️ Compilou, mas o RPO não mudou? O mistério das compilações que vão para o limbo no Protheus

# 🕵️ Compilou, mas o RPO não mudou? O mistério das compilações que vão para o limbo no Protheus

Quem desenvolve em **AdvPL/TLPP no Protheus** provavelmente já passou por uma situação parecida:

> Compilei o fonte.
> O VS Code informou que compilou.
> Não apareceu erro.
> Executei novamente...
> **e o comportamento continuou exatamente igual.**

A primeira reação normalmente é desconfiar de tudo.

* Será que compilei o fonte correto?
* Será que estou conectado no ambiente certo?
* Será que existe outro fonte com a mesma função?
* Será que o VS Code não enviou a compilação?
* Será que o AppServer está usando algum cache?

> Ou, no clássico método científico do desenvolvedor:
>> **"Vou colocar um `ConOut()` aqui só para ter certeza."** 😂

Pois bem.

Depois de algumas ocorrências desse comportamento, finalmente encontrei uma situação que explica pelo menos parte desses misteriosos casos de:

## 👻 "Compilou, mas não atualizou o RPO"

O cenário é relativamente simples.

Você está desenvolvendo normalmente pelo **VS Code**, conectado a determinado ambiente/RPO.

A conexão permanece ativa.

Enquanto isso, **um pacote/patch é aplicado nesse mesmo ambiente**.

O detalhe importante é que sua sessão de desenvolvimento continua trabalhando com a referência do **RPO que estava carregado anteriormente em memória**.

O RPO em disco foi alterado pela aplicação do pacote.

Mas sua conexão continua vinculada ao estado anterior.

E aí nasce uma situação particularmente traiçoeira:

```text
VS Code
   │
   │ conexão já estabelecida
   ▼
AppServer
   │
   ├── RPO carregado/referenciado em memória
   │
   │       ⚠ estado anterior
   │
   ▼
Compilação aparentemente OK


Enquanto isso...


Aplicação do pacote
   │
   ▼
RPO em disco
   │
   └── estado novo
```

> Você continua compilando.

* O VS Code pode informar sucesso.
* Você altera o fonte novamente.
* Compila novamente.
* Executa.

> Nada.

* Compila de novo.

> Nada.

E começa aquela agradável fase do desenvolvimento conhecida como:

> **"Estou ficando maluco ou esse fonte não está compilando?"** 🤡

## 🗑️ Suas compilações estão indo para o "limbo"

Na prática, o problema não necessariamente está no seu fonte.

O problema está no **estado da conexão e do RPO mantido pelo AppServer** depois que o repositório foi alterado externamente pela aplicação do pacote.

A sessão que estava aberta antes da atualização não necessariamente passa a trabalhar automaticamente sobre o novo estado do RPO.

Resultado:

**você acredita estar compilando sobre o RPO atualizado, mas sua conexão ainda está presa ao contexto anterior.**

E isso explica por que o problema parece tão aleatório.

Na verdade, não é exatamente:

> "Às vezes o Protheus não atualiza minha compilação."

Existe uma condição que pode provocar o comportamento:

> **A conexão de desenvolvimento já estava ativa quando ocorreu uma alteração externa no RPO, como a aplicação de um pacote.**

Esse detalhe muda completamente a investigação.

---

# 🔌 A solução: reconectar

Se um pacote foi aplicado no ambiente enquanto sua conexão de desenvolvimento estava ativa, a primeira providência deveria ser:

1. **Desconectar o VS Code do ambiente;**
2. **Conectar novamente;**
3. **Recompilar o fonte.**

Mas, quando possível, prefiro uma abordagem ainda mais segura:

> **reiniciar o serviço/AppServer utilizado para desenvolvimento e depois reconectar o VS Code.**

Assim eliminamos qualquer dúvida sobre o estado do RPO mantido pelo processo.

O fluxo passa a ser:

```text
Aplicação do pacote
        │
        ▼
     Novo RPO
        │
        ▼
Reinicia AppServer
        │
        ▼
Reconecta VS Code
        │
        ▼
   Compila novamente
        │
        ▼
      Novo RPO
```

---

# ⚠️ O detalhe perigoso: a compilação pode parecer bem-sucedida

Esse é, para mim, o ponto mais importante.

Se houvesse simplesmente um grande:

```text
ERROR: RPO CHANGED - RECONNECT YOUR ENVIRONMENT
```

ninguém perderia muito tempo. 😅

O problema é justamente a possibilidade de a operação **aparentar ter ocorrido normalmente**.

Do ponto de vista do desenvolvedor:

```text
Fonte alterado
      ↓
Ctrl + F9
      ↓
Compilação OK
      ↓
Executa rotina
      ↓
🤨
```

E então começamos a investigar o código quando, na realidade, deveríamos estar investigando **o estado do ambiente**.

---

# 🧠 Uma nova regra para minha checklist de desenvolvimento Protheus

Depois dessa descoberta, acrescentei mentalmente mais uma pergunta à investigação quando uma alteração "não entra":

```text
☑ Estou no ambiente correto?
☑ Estou compilando o fonte correto?
☑ Existe outro fonte/função sobrescrevendo este?
☑ O fonte realmente foi compilado?
☑ O AppServer correto está sendo utilizado?
☑ ALGUM PACOTE FOI APLICADO DEPOIS QUE ME CONECTEI?
```

Se a resposta para a última pergunta for **sim**:

> 🔌 **desconecta e conecta novamente.**

E, preferencialmente:

> 🔄 **reinicia o AppServer de desenvolvimento.**

Só depois disso vale a pena começar a colocar `ConOut()`, breakpoint em tudo quanto é canto e questionar as próprias escolhas profissionais. 😂

---

# 💡 A lição vai além do Protheus

Esse caso também lembra uma coisa importante sobre desenvolvimento em ambientes com **estado mantido em memória**.

O arquivo que existe **no disco** e aquilo que determinado processo possui **carregado em memória** não são necessariamente a mesma coisa naquele instante.

Quando outro processo modifica um artefato compartilhado — neste caso, o **RPO** — conexões previamente estabelecidas podem continuar trabalhando sobre um estado que deixou de representar aquilo que agora existe fisicamente no ambiente.

Por isso, quando houver:

**VS Code conectado + aplicação de pacote + comportamento estranho nas compilações**

antes de perder uma hora procurando um bug inexistente no fonte...

## 🔌 Reconecte.

E, se puder:

## 🔄 Reinicie o AppServer.

Às vezes o código está certo.

A compilação também.

Você só estava compilando para...

# 🕳️ o RPO do multiverso. 😎

---

**Desenvolvimento Protheus também é entender o que acontece entre o `Ctrl+F9` e o RPO.**

E são justamente esses pequenos detalhes de ambiente que conseguem consumir horas de debugging quando não sabemos que eles existem.

---

#DNATech,#AdvPL #TLPP #Protheus #TOTVS #VSCode #AppServer #RPO #Desenvolvimento #Debug #Programacao #SoftwareEngineering #TOTVSProtheus

Comentários

Postagens mais visitadas