Files
flutter_dotenv/README.md
abishop-jac 5ed35155de chore: update readme (#45)
Include a comment in example .env file, to show comment syntax.
Fix documentation of get method.
2021-08-13 10:52:45 +12:00

228 lines
6.2 KiB
Markdown

# flutter_dotenv
[![Pub Version][pub-badge]][pub]
[pub]: https://pub.dartlang.org/packages/flutter_dotenv
[pub-badge]: https://img.shields.io/pub/v/flutter_dotenv.svg
Load configuration at runtime from a `.env` file which can be used throughout the application.
> **The [twelve-factor app][12fa] stores [config][cfg] in _environment variables_**
> (often shortened to _env vars_ or _env_). Env vars are easy to change
> between deploys without changing any code... they are a language- and
> OS-agnostic standard.
[12fa]: https://www.12factor.net
[cfg]: https://12factor.net/config
# About
This library is a fork of [mockturtl/dotenv] dart library, initially with slight changes to make it work with flutter.
[mockturtl/dotenv]: https://pub.dartlang.org/packages/dotenv
An _environment_ is the set of variables known to a process (say, `PATH`, `PORT`, ...).
It is desirable to mimic the production environment during development (testing,
staging, ...) by reading these values from a file.
This library parses that file and merges its values with the built-in
[`Platform.environment`][docs-io] map.
[docs-io]: https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:io.Platform#id_environment
# Usage
1. Create a `.env` file in the root of your project with the example content:
```sh
FOO=foo
BAR=bar
FOOBAR=$FOO$BAR
ESCAPED_DOLLAR_SIGN='$1000'
# This is a comment
```
> Note: If deploying to web server, ensure that the config file is uploaded and not ignored. (Whitelist the config file on the server, or name the config file without a leading `.`)
2. Add the `.env` file to your assets bundle in `pubspec.yaml`. **Ensure that the path corresponds to the location of the .env file!**
```yml
assets:
- .env
```
3. Remember to add the `.env` file as an entry in your `.gitignore` if it isn't already unless you want it included in your version control.
```txt
*.env
```
4. Load the `.env` file in `main.dart`. Note that `flutter_dotenv >=5.0.0` has a slightly different syntax for consuming the DotEnv data.
**v5.0.0 and later**
```dart
import 'package:flutter_dotenv/flutter_dotenv.dart';
// DotEnv dotenv = DotEnv() is automatically called during import.
// If you want to load multiple dotenv files or name your dotenv object differently, you can do the following and import the singleton into the relavant files:
// DotEnv another_dotenv = DotEnv()
Future main() async {
// To load the .env file contents into dotenv.
// NOTE: fileName defaults to .env and can be omitted in this case.
// Ensure that the filename corresponds to the path in step 1 and 2.
await dotenv.load(fileName: ".env");
//...runapp
}
```
You can then access variables from `.env` throughout the application
```dart
import 'package:flutter_dotenv/flutter_dotenv.dart';
dotenv.env['VAR_NAME'];
```
**Before v5.0.0**
```dart
import 'package:flutter_dotenv/flutter_dotenv.dart' as DotEnv;
Future main() async {
await DotEnv.load(fileName: ".env");
//...runapp
}
```
Access env using:
```dart
import 'package:flutter_dotenv/flutter_dotenv.dart';
env['VAR_NAME'];
```
Optionally you could map `env` after load to a config model to access a config with types.
# Advanced usage
Refer to the `test/dotenv_test.dart` file for a better idea of the behaviour of the `.env` parser.
## Referencing
You can reference variables defined above other within `.env`:
```
FOO=foo
BAR=bar
FOOBAR=$FOO$BAR
```
You can escape referencing by wrapping the value in single quotes:
```dart
ESCAPED_DOLLAR_SIGN='$1000'
```
## Merging
You can merge a map into the environment on load:
```dart
await DotEnv.load(mergeWith: { "FOO": "foo", "BAR": "bar"});
```
You can also reference these merged variables within `.env`:
```
FOOBAR=$FOO$BAR
```
## Using in tests
There is a `testLoad` method that can be used to load a static set of variables for testing.
```dart
// Loading from a static string.
dotenv.testLoad(fileInput: '''FOO=foo
BAR=bar
''');
// Loading from a file synchronously.
dotenv.testLoad(fileInput: File('test/.env').readAsStringSync());
```
## Null safety
To avoid null-safety checks for variables that are known to exist, there is a `get()` method that
will throw an exception if the variable is undefined. You can also specify a default fallback
value for when the variable is undefined in the .env file.
```dart
Future<void> main() async {
await dotenv.load();
String foo = dotenv.get('VAR_NAME');
// Or with fallback.
String bar = dotenv.get('MISSING_VAR_NAME', fallback: 'sane-default');
// This would return null.
String? baz = dotenv.maybeGet('MISSING_VAR_NAME', fallback: null);
}
```
## Usage with Platform Environment
The Platform.environment map can be merged into the env:
```dart
// For example using Platform.environment that contains a CLIENT_ID entry
await DotEnv.load(mergeWith: Platform.environment);
print(env["CLIENT_ID"]);
```
Like other merged entries described above, `.env` entries can reference these merged Platform.Environment entries if required:
```
CLIENT_URL=https://$CLIENT_ID.dev.domain.com
```
# Discussion
Use the [issue tracker][tracker] for bug reports and feature requests.
Pull requests are welcome.
[tracker]: https://github.com/java-james/flutter_dotenv/issues
# Prior art
[flutter_dotenv]: https://pub.dartlang.org/packages/dotenv
- [mockturtl/dotenv][] (dart)
- [bkeepers/dotenv][] (ruby)
- [motdotla/dotenv][] (node)
- [theskumar/python-dotenv][] (python)
- [joho/godotenv][] (go)
- [slapresta/rust-dotenv][] (rust)
- [chandu/dotenv][] (c#)
- [tpope/lein-dotenv][], [rentpath/clj-dotenv][] (clojure)
- [mefellows/sbt-dotenv][] (scala)
- [greenspun/dotenv][] (half of common lisp)
[mockturtl/dotenv]: https://pub.dartlang.org/packages/dotenv
[bkeepers/dotenv]: https://github.com/bkeepers/dotenv
[motdotla/dotenv]: https://github.com/motdotla/dotenv
[theskumar/python-dotenv]: https://github.com/theskumar/python-dotenv
[joho/godotenv]: https://github.com/joho/godotenv
[slapresta/rust-dotenv]: https://github.com/slapresta/rust-dotenv
[chandu/dotenv]: https://github.com/Chandu/DotEnv
[tpope/lein-dotenv]: https://github.com/tpope/lein-dotenv
[rentpath/clj-dotenv]: https://github.com/rentpath/clj-dotenv
[mefellows/sbt-dotenv]: https://github.com/mefellows/sbt-dotenv
[greenspun/dotenv]: https://www.youtube.com/watch?v=pUjJU8Bbn3g
# license: [MIT](LICENSE)