getReleaseDirectory method

Future<String> getReleaseDirectory({
  1. required String environment,
  2. String? basePath,
})

Determines the release directory path based on configuration and current environment.

By default, reads output_directory and organize_by from flutter_build_manager.yaml. Creates the directory on disk if it does not exist.

Implementation

Future<String> getReleaseDirectory({required String environment, String? basePath}) async {
  final root = basePath ?? Directory.current.path;
  String baseOutputDir = p.join('build', 'release');

  bool orgDate = true;
  bool orgEnv = true;

  final file = File(p.join(root, _configPath));
  if (file.existsSync()) {
    try {
      final content = await file.readAsString();
      final doc = loadYaml(content);
      if (doc is YamlMap && doc['release_manager'] is YamlMap) {
        final rm = doc['release_manager'];

        if (rm['output_directory'] != null) {
          baseOutputDir = rm['output_directory'].toString();
        }

        if (rm['organize_by'] is YamlMap) {
          final org = rm['organize_by'];
          orgDate = org['date'] ?? true;
          orgEnv = org['environment'] ?? true;
        }
      }
    } catch (_) {
      // Fall back to defaults on parsing error
    }
  }

  final now = DateTime.now();
  final pathSegments = <String>[baseOutputDir];

  if (orgDate) {
    pathSegments.add(DateFormat('dd_MM_yyyy').format(now));
  }

  if (orgEnv) {
    pathSegments.add(environment);
  }

  final fullPath = p.joinAll([root, ...pathSegments]);

  final dir = Directory(fullPath);
  if (!dir.existsSync()) {
    dir.createSync(recursive: true);
  }

  return dir.absolute.path;
}