# dotenv

Primeiramente, o que são arquivos env? Uma rápida explicação seria:

*"É um arquivo de texto de configuração simples, que é usado para definir algumas variáveis que você deseja passar para o ambiente do seu aplicativo."*

Basicament&#x65;*,* fazer o uso de arquivos env nos projetos, é uma maneira mais segura para utilização de algumas coisas, como algumas keys de sdks, ou quaisquers outras informações críticas.

Invés de setarmos esses valores diretamente em arquivos nos nossos projetos, fazemos a criação de um arquivo .env, e ele vai conter todas essas nossas variáveis. A ideia também, é não fazer o upload desse arquivo para nenhuma plataforma de código, fazendo com que todo desenvolvedor que quiser rodar o projeto, tenha que preencher manualmente essas variáveis.

Vamos ao uso, utilizando o [plugin](https://pub.dev/packages/flutter_dotenv):

* Criamos um arquivo .env na raiz do projeto (pode ser qualquer nome, desde que inicie com .)
* Adicionamos essa extensão no arquivo .gitignore
* No pubspec.yaml adicionamos o arquivo nos assets:

```yml
assets:
  - .env.staging
  - .env.production
```

&#x20;Essas são as configurações básicas, aqui abaixo um exemplo de como o arquivo vai ser:

```properties
STRIPE_SK_KEY=valor_aqui
STRIPE_PK_KEY=valor-aqui
ADJUST_KEY=valorzao
BASE_URL=base_url_aqui
```

Com isso, vou mostrar o uso real em uma estrutura como nos nossos projetos a partir do leap.

Dentro do arquivo setup\_flavors, invés de setar os valores para variáveis por lá, fazemos o carregamento do arquivo env definido para aquele flavor:

<pre class="language-dart"><code class="lang-dart"><strong>if (packageInfo.packageName.contains("staging")) {
</strong>      await dotenv.load(fileName: ".env.staging");
      currentFlavor = FlavorsOptions.staging;
} else {
      await dotenv.load(fileName: ".env.production");
      currentFlavor = FlavorsOptions.production;
  }
</code></pre>

Com isso, de acordo com o Flavor que rodarmos, teremos acesso ao arquivo correspondente.

E então para realizar o uso das variáveis, é necessário fazer a chamada da seguinte maneira:

<pre class="language-dart"><code class="lang-dart"><strong>String stripePkKey = dotenv.env['STRIPE_PK_KEY'] ?? ""
</strong></code></pre>

Vou trazer aqui uma organização melhor para fazer o uso em projetos de alto nível. Primeiramente, vamos criar uma classe com métodos estáticos, onde vamos setar cada um dos valores que virão do env.

```dart
class Environments {
  static String get baseUrl => dotenv.env['BASE_URL'] ?? "";

  static String get webSiteUrl => dotenv.env['WEBSITE'] ?? "";
}
```

E para seu uso, basta usar da seguinte maneira, de maneira muito mais organizada e bonita:

```dart
 Environments.webSiteUrl
```

A seguir, veja como configurar o CI/CD no Codemagic, para o uso do arquivo .env.

{% content-ref url="dotenv/.env-codemagic" %}
[.env-codemagic](https://loomi.gitbook.io/flutter-loomi/processos-e-microprodutos/microprodutos/dotenv/.env-codemagic)
{% endcontent-ref %}

{% hint style="warning" %}
PARA O FUTURO: Discutir uma maneira, um arquivo, ou algo do tipo, para manter apenas os nomes das chaves existentes para cada projeto. Para que quando alguém for rodar, saber quais as chaves tem que ser preenchidas. E já que o arquivo .env não sobe para o github com os valores, deve ser pensada uma maneira de resolver isso.
{% endhint %}

**O FUTURO CHEGOU!!!**

Para resolver o problema abordado acima, vamos seguir o seguinte padrão:

* Vamos criar um arquivo na raiz do projeto chamado .env.example
* Este arquivo vai subir para o repositorio
* Esse arquivo vai conter todas as chaves que devem existir no .env de produção para funcionar
* Porém, todas as chaves vão estar vazias.
