Future _createMergedOutputDir()

in build_runner_core/lib/src/environment/create_merged_dir.dart [85:163]


Future<bool> _createMergedOutputDir(
    String outputPath,
    String? root,
    PackageGraph packageGraph,
    BuildEnvironment environment,
    AssetReader reader,
    FinalizedAssetsView finalizedOutputsView,
    bool symlinkOnly,
    bool hoist) async {
  try {
    if (root == null) return false;
    var absoluteRoot = p.join(packageGraph.root.path, root);
    if (absoluteRoot != packageGraph.root.path &&
        !p.isWithin(packageGraph.root.path, absoluteRoot)) {
      _logger.severe(
          'Invalid dir to build `$root`, must be within the package root.');
      return false;
    }
    var outputDir = Directory(outputPath);
    var outputDirExists = await outputDir.exists();
    if (outputDirExists) {
      if (!await _cleanUpOutputDir(outputDir, environment)) return false;
    }
    var builtAssets = finalizedOutputsView.allAssets(rootDir: root).toList();
    if (root != '' &&
        !builtAssets
            .where((id) => id.package == packageGraph.root.name)
            .any((id) => p.isWithin(root, id.path))) {
      _logger.severe('No assets exist in $root, skipping output');
      return false;
    }

    var outputAssets = <AssetId>[];

    await logTimedAsync(_logger, 'Creating merged output dir `$outputPath`',
        () async {
      if (!outputDirExists) {
        await outputDir.create(recursive: true);
      }

      outputAssets.addAll(await Future.wait([
        for (var id in builtAssets)
          _writeAsset(
              id, outputDir, root, packageGraph, reader, symlinkOnly, hoist),
        _writeCustomPackagesFile(packageGraph, outputDir),
        if (await reader.canRead(_packageConfigId(packageGraph.root.name)))
          _writeModifiedPackageConfig(
              packageGraph.root.name, reader, outputDir),
      ]));

      if (!hoist) {
        for (var dir in _findRootDirs(builtAssets, outputPath)) {
          var link = Link(p.join(outputDir.path, dir, 'packages'));
          if (!link.existsSync()) {
            link.createSync(p.join('..', 'packages'), recursive: true);
          }
        }
      }
    });

    await logTimedAsync(_logger, 'Writing asset manifest', () async {
      var paths = outputAssets.map((id) => id.path).toList()..sort();
      var content = paths.join(_manifestSeparator);
      await _writeAsString(
          outputDir, AssetId(packageGraph.root.name, _manifestName), content);
    });

    return true;
  } on FileSystemException catch (e) {
    if (e.osError?.errorCode != 1314) rethrow;
    var devModeLink =
        'https://docs.microsoft.com/en-us/windows/uwp/get-started/'
        'enable-your-device-for-development';
    _logger.severe('Unable to create symlink ${e.path}. Note that to create '
        'symlinks on windows you need to either run in a console with admin '
        'privileges or enable developer mode (see $devModeLink).');
    return false;
  }
}