> For the complete documentation index, see [llms.txt](https://docs.skail.dev/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.skail.dev/construir/configurar-e-hospedar/como-rodar-localmente.md).

# Como rodar localmente

Como desenvolver e testar um fluxo skail na sua máquina: o que roda no seu computador, o que continua no skail, e o ciclo de editar, rodar e disparar.

## O modelo

A sua aplicação roda na sua máquina com `dotnet run`, exatamente como vai rodar em produção. O runtime dentro dela conecta ao skail usando as credenciais de um environment de desenvolvimento e passa a receber as execuções desse environment. A durabilidade, o agendamento e o Monitor continuam no skail: você desenvolve contra o mesmo mecanismo que vai usar em produção, sem simular nada.

Isso tem uma consequência prática: dois desenvolvedores apontando para o mesmo environment `dev` com o mesmo `SKAIL_WORKLOAD` disputam as mesmas execuções. Use um environment por desenvolvedor ou, no mínimo, um nome de workload por pessoa (`cobranca-maria:v0.0.1`).

## Passo a passo

1. Crie (ou peça) um environment de desenvolvimento no portal e anote chave, namespace e URL base. Ver [Environments](/construir/portal/environments.md).
2. Crie o workload com o nome e a versão que você vai usar localmente, por exemplo `cobranca-maria:v0.0.1`.
3. Configure a aplicação. Para não versionar a chave, use `dotnet user-secrets` ou variáveis de ambiente do terminal:

```bash
dotnet user-secrets init
dotnet user-secrets set "skail:key" "SUA_SKAIL_KEY"
dotnet user-secrets set "skail:namespace" "SEU_NAMESPACE"
dotnet user-secrets set "skail:workload" "cobranca-maria:v0.0.1"
dotnet user-secrets set "skail:sidecar" "<endereço do skail>"
```

O runtime lê a seção `skail` da configuração do .NET, então user-secrets funciona como `appsettings`. Ver [Como configurar o runtime](/construir/configurar-e-hospedar/como-configurar-o-runtime.md).

4. Rode a aplicação. Ela sobe e fica em espera por trabalho:

```bash
dotnet run
```

5. Dispare pela API com cURL, apontando para o seu workload:

```bash
curl -X POST "https://SEU_SKAIL_BASE_URL/trigger/cobranca-maria/v0.0.1/EmitirFatura/8f2c3a10-0000-4000-8000-000000000001" \
  -H "Content-Type: application/json" \
  -H "skail-key: SUA_SKAIL_KEY" \
  -H "Skail-namespace: SEU_NAMESPACE" \
  -d '["8f2c3a10-0000-4000-8000-000000000001"]'
```

Guarde esse comando em um arquivo `.http` do VS Code ou do Rider, ou em um script; você vai repetir muito.

6. Acompanhe no Monitor do environment. Coloque um breakpoint dentro de um command e dispare: o depurador para ali como em qualquer aplicação .NET.

## O ciclo de desenvolvimento

Edite, `dotnet run`, dispare com um id novo, olhe o Monitor e o terminal. Use um id novo a cada disparo enquanto o fluxo muda: uma execução antiga, iniciada por uma versão anterior do código, vai falhar com `SkailNonDeterministicException` se for retomada pelo código novo. Isso é o esperado em desenvolvimento e é a razão de existir [Versionamento](/aprender/fundamentos/versionamento-de-codigo-com-execucoes-em-andamento.md) em produção.

Execuções que ficaram hibernadas em um `WaitForEvent` durante o desenvolvimento aparecem no Monitor como aguardando evento. Dispare o evento por cURL para concluí-las, ou deixe o prazo do `WhenAny` vencer.

## Depurar uma execução de produção

Para reproduzir localmente uma execução que aconteceu em produção, com os argumentos e resultados originais, use o Time Travel Debug: [Como depurar com Time Travel Debug](/construir/testar-depurar-e-observar/como-depurar-com-time-travel-debug.md).

## Testes sem skail

Para testar functions e commands sem conectar a nada, o pacote de testes roda tudo em memória: [Como testar funções com Skail.Platform.Runtime.Testing](/construir/testar-depurar-e-observar/como-testar-funcoes-com-skail.platform.runtime.testing.md).

## Próximos passos

[Quickstart](/aprender/readme.md) é este ciclo em dez minutos. [Como hospedar](/construir/configurar-e-hospedar/como-hospedar-worker-service-asp.net-core-container-kubernetes-azure.md) para levar o mesmo build a um container ou ao Kubernetes. [Troubleshooting](/operar/troubleshooting.md) quando a execução não aparece.
