Skip to content

A Flutter CLI tool to automate the creation and maintenance of the env Flutter package from multiple .env files.

License

Notifications You must be signed in to change notification settings

KalybosPro/env_builder_cli

env_builder_cli

pub package License: MIT Dart SDK Version

A powerful Dart CLI tool that automates the creation and maintenance of environment packages for Flutter applications. Generate type-safe environment variable access from .env files with built-in encryption support.

Features

  • πŸš€ Automated Environment Package Generation: Automatically creates Flutter packages from .env files
  • πŸ” Built-in Encryption: AES encryption support for sensitive environment variables
  • πŸ“ Type-Safe Access: Generates Dart classes using Envied for compile-time safety
  • πŸ—οΈ Flutter Integration: Seamlessly integrates with Flutter projects and handles pubspec dependencies
  • πŸ”„ Multi-Environment Support: Handle development, staging, production, and custom environments
  • πŸ“‚ Git Integration: Automatic .gitignore updates with appropriate environment file rules
  • πŸ§ͺ Testing Support: Generates test files for environment variable validation

Installation

Global Installation

Install the CLI globally using pub:

dart pub global activate env_builder_cli

Or using the executable name:

dart pub global activate env_builder

Local Installation

Add to your pubspec.yaml:

dev_dependencies:
  env_builder_cli: ^1.1.2

Usage

Basic Usage

Navigate to your Flutter project root and run:

# Build with all .env* files found in current directory (.env.ci, .env.custom, .env.app, etc.)
env_builder build

# Build with specific environment files
env_builder build --env-file=.env.development,.env.production,.env.staging

This will:

  1. Create a packages/env directory
  2. Copy your .env files to the env package
  3. Generate Dart classes for type-safe access
  4. Update dependencies in pubspec.yaml files
  5. Run flutter pub get automatically

Commands

Build Command

Generates environment packages from .env files:

# Build with default configuration (auto-detects .env* files)
env_builder build

# Build with specific environment files
env_builder build --env-file=.env.dev,.env.prod

# Build with custom output directory
env_builder build --output-dir=custom_env

Planned Features:

  • --output-dir: Custom output directory (default: packages/env)
  • --no-encrypt: Skip encryption of sensitive variables
  • --verbose: Detailed output during build process
  • Complex Data Types Support: Handle JSON-like strings (e.g., APP_CONFIG={"theme":"dark","features":["chat","notifications"]})
  • --config-env-file: Specify a default configuration file for environment-specific settings

Encrypt Command

Encrypt sensitive environment files:

env_builder encrypt --password=yourSecretKey .env

Decrypt Command

Decrypt previously encrypted environment files:

env_builder decrypt --password=yourSecretKey .env.encrypted

Version Command

Displays version information:

env_builder version
# or
env_builder --version

Aliases:

  • --version, -v

Displays:

  • CLI version (from pubspec.yaml)
  • Dart SDK version
  • Tool description
  • Homepage URL

Environment File Format

Create .env files in your project root:

# .env.development
BASE_URL=https://dev-api.example.com
API_KEY=dev_key_123
DEBUG=true

# .env.production
BASE_URL=https://api.example.com
API_KEY=prod_key_456
DEBUG=false

Generated Code

The tool generates type-safe Dart classes:

// env.development.dart
import 'package:envied/envied.dart';

part 'env.development.g.dart';

@Envied(path: '.env.development')
abstract class EnvDevelopment {
  @EnviedField(varName: 'BASE_URL')
  static const String baseUrl = _EnvDevelopment.baseUrl;

  @EnviedField(varName: 'API_KEY', obfuscate: true)
  static final String apiKey = _EnvDevelopment.apiKey;

  @EnviedField(varName: 'DEBUG')
  static const bool debug = _EnvDevelopment.debug;
}

Flutter Integration

In your Flutter app, use the generated environments:

import 'package:env/env.dart';

// Access environment variables
final appFlavor = AppFlavor.production();

class ApiService {
    final appBaseUrl = appFlavor.getEnv(Env.baseUrl);
    final apikey = appFlavor.getEnv(Env.apiKey);
}

Project Structure

After running the build command, your project structure will look like:

your-flutter-project/
β”œβ”€β”€ packages/
β”‚   └── env/
β”‚       β”œβ”€β”€ .env.development
β”‚       β”œβ”€β”€ .env.production
β”‚       β”œβ”€β”€ env.development.dart
β”‚       β”œβ”€β”€ env.production.dart
β”‚       β”œβ”€β”€ env.dart (barrel export)
β”‚       β”œβ”€β”€ env.g.dart (enum definitions)
β”‚       └── pubspec.yaml
β”œβ”€β”€ .env.development
β”œβ”€β”€ .env.production
β”œβ”€β”€ pubspec.yaml (updated with env dependency)
└── lib/
    └── main.dart

Security Best Practices

  1. Never commit .env files - Add them to .gitignore
  2. Use encryption for sensitive production variables
  3. Store secrets securely in your CI/CD platform
  4. Use different keys for different environments
  5. Rotate secrets regularly

Examples

Check the example/ directory for a complete working example.

To run the example:

cd example
flutter pub get
# The .env file already exists
env_builder build --env-file=.env
flutter run

Contributing

Contributions are welcome! Please see CONTRIBUTING.md for details.

License

This project is licensed under the MIT License - see the LICENSE file for details.


Made with ❀️ for the Flutter community

About

A Flutter CLI tool to automate the creation and maintenance of the env Flutter package from multiple .env files.

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Packages

No packages published