> 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/opere/configurar-e-hospedar/rodar-localmente.md).

# 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 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](/referencia/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 sem versionar a chave:

{% tabs %}
{% tab title="C#" %}
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`.
{% endtab %}

{% tab title="TypeScript" %}
Defina no terminal as variáveis de ambiente `SKAIL_WORKLOAD`, `SKAIL_NAMESPACE`, `SKAIL_KEY` e `SKAIL_SIDECAR`, com os valores do environment de desenvolvimento (por exemplo, `SKAIL_WORKLOAD=cobranca-maria:v0.0.1`).
{% endtab %}
{% endtabs %}

Ver [Como configurar o runtime](/opere/configurar-e-hospedar/configurar-o-runtime.md).

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

{% tabs %}
{% tab title="C#" %}

```bash
dotnet run
```

{% endtab %}

{% tab title="TypeScript" %}
Gere o build com o mesmo workload do `SKAIL_WORKLOAD`:

```bash
node_modules/.bin/skail build src/entries/app.ts --workload cobranca-maria:v0.0.1 \
  --out .skail/skail-functions.mjs --manifest .skail/manifest.json
```

Se o `--workload` for diferente do `SKAIL_WORKLOAD`, a aplicação não sobe e o log mostra `Manifest workload ... does not match ...`. Depois rode o host (`main.ts`) no terminal onde as variáveis `SKAIL_*` estão definidas.
{% endtab %}
{% endtabs %}

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

```bash
ID=$(uuidgen | tr '[:upper:]' '[:lower:]')
curl -X POST "https://SEU_SKAIL_BASE_URL/api/v1/trigger/cobranca-maria/v0.0.1/EmitirFatura/$ID" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer SUA_SKAIL_KEY" \
  -H "skail-key: SUA_SKAIL_KEY" \
  -H "Skail-namespace: SEU_NAMESPACE" \
  -d '["8f2c3a10-0000-4000-8000-000000000001"]'
echo $ID
```

{% hint style="info" %}
Guarde esse comando em um script: ele gera um id novo a cada disparo.
{% endhint %}

6. Acompanhe no [Monitor](https://dash.skail.dev/monitor/) do environment. Em C#, coloque um breakpoint dentro de um command e dispare: o depurador para ali como em qualquer aplicação .NET.

## O ciclo de desenvolvimento

A cada mudança:

* edite o código;
* gere o build;
* rode a aplicação;
* dispare com o comando guardado;
* confira o Monitor e o terminal.

Cada disparo usa um id novo, para cada teste começar uma execução do zero com o código atual. Em produção, a convivência entre execuções em andamento e código novo é tratada pelo [Versionamento](/construa/conceitos/versoes-com-execucoes-em-andamento.md).

Execuções que ficaram hibernadas em uma espera por evento durante o desenvolvimento aparecem no Monitor como aguardando evento. Dispare o evento por cURL para concluí-las ou, se a espera tiver prazo, deixe o prazo 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](/construa/como-fazer/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 functions](/construa/como-fazer/testar-seus-fluxos.md).

## Próximos passos

<table data-view="cards"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><i class="fa-bolt">:bolt:</i></td><td><strong>Quickstart</strong></td><td>É este ciclo em dez minutos.</td><td><a href="/comece-aqui/quickstart.md">Quickstart (10 min)</a></td></tr><tr><td><i class="fa-cloud">:cloud:</i></td><td><strong>Como hospedar</strong></td><td>Para levar o mesmo build a um container ou ao Kubernetes.</td><td><a href="/opere/configurar-e-hospedar/container-kubernetes-e-azure.md">Container, Kubernetes e Azure</a></td></tr><tr><td><i class="fa-screwdriver-wrench">:screwdriver-wrench:</i></td><td><strong>Troubleshooting</strong></td><td>Quando a execução não aparece.</td><td><a href="/opere/troubleshooting.md">Troubleshooting</a></td></tr></tbody></table>
