# Executar em modo debug e em modo release

> As opções de Total.run() escolhem entre o modo debug e o release; leia o modo com DEBUG e limite rotas a um modo com @debug e @release.

Framework: total5
Product: Total.js 5 (total5@0.0.19)
Language: pt
Content-SHA256: 29fcdf703602391c65193549a3ba386e0fc78b74aa93316609ce5a4f2c76c348
Snapshot: c0700e321579725c5cf4f5ace1ad7d2866d1b4f93c24a63c0b41b6b7998e976c
Sources: total5-installed@total5@0.0.19
Review: not-recorded

O Total.js funciona num de dois modos, **debug** para desenvolver e **release** para o servidor, e o booleano global `DEBUG` diz ao seu código qual está ativo. No modo debug a aplicação corre sob um watcher que a reinicia quando altera um ficheiro, os erros mostram detalhes e são geradas source maps. O modo release não tem watcher e as páginas de erro não mostram os detalhes técnicos.

O modo é escolhido pela forma como a aplicação é iniciada, no script de arranque (`index.js`) que chama `Total.run(options)`:

- por omissão é debug, com o watcher;
- `options.release = true` inicia o modo release; o script de arranque que o Total.js gera ativa-o a partir da linha de comandos, por isso `node index.js --release` é a forma de arrancar a produção;
- `options.watcher = false` executa um único processo sem watcher, e isso é sempre o modo release (é o que usam os exemplos deste livro de receitas).

Antes de `Total.run()` ter decidido, `DEBUG` tem um valor por omissão vindo de `NODE_ENV`: é `false` quando `NODE_ENV=production` e `true` caso contrário. O código que corre no momento em que um módulo é carregado vê esse valor por omissão, por isso não confie em `NODE_ENV` para o modo final, apenas em `DEBUG` depois de a aplicação ter arrancado.

As rotas podem seguir o modo. A flag `@debug` faz com que uma rota exista só no modo debug e `@release` só no modo release; no outro modo o URL responde 404. Use `@debug` para as ferramentas de que precisa durante o desenvolvimento (um visualizador de base de dados, uma rota de dados de teste), para que nunca cheguem à produção por acidente.

```js controllers/mode.js
exports.install = function() {
	ROUTE('GET /mode/', mode);
	ROUTE('GET /tools/ @debug', tools);
	ROUTE('GET /status/ @release', status);
};

function mode($) {
	$.json({ debug: DEBUG });
}

function tools($) {
	$.json({ tools: true });
}

function status($) {
	$.json({ status: 'ok' });
}
```
