dryRun method

Future<DryRunResult> dryRun({
  1. required LinkModePreferenceImpl linkModePreference,
  2. required OSImpl targetOS,
  3. required Uri workingDirectory,
  4. required bool includeParentEnvironment,
  5. PackageLayout? packageLayout,
  6. String? runPackageName,
  7. Iterable<String>? supportedAssetTypes,
})

workingDirectory is expected to contain .dart_tool.

This method is invoked by launchers such as dartdev (for dart run) and flutter_tools (for flutter run and flutter build).

If provided, only native assets of all transitive dependencies of runPackageName are built.

Implementation

Future<DryRunResult> dryRun({
  required LinkModePreferenceImpl linkModePreference,
  required OSImpl targetOS,
  required Uri workingDirectory,
  required bool includeParentEnvironment,
  PackageLayout? packageLayout,
  String? runPackageName,
  Iterable<String>? supportedAssetTypes,
}) async {
  packageLayout ??= await PackageLayout.fromRootPackageRoot(workingDirectory);
  final packagesWithNativeAssets =
      await packageLayout.packagesWithNativeAssets;
  final List<Package> buildPlan;
  if (packagesWithNativeAssets.length <= 1 && runPackageName == null) {
    buildPlan = packagesWithNativeAssets;
  } else {
    final planner = await NativeAssetsBuildPlanner.fromRootPackageRoot(
      rootPackageRoot: packageLayout.rootPackageRoot,
      packagesWithNativeAssets: packagesWithNativeAssets,
      dartExecutable: Uri.file(Platform.resolvedExecutable),
      logger: logger,
    );
    final (plan, planSuccess) = planner.plan(
      runPackageName: runPackageName,
    );
    if (!planSuccess) {
      return _DryRunResultImpl(
        assets: [],
        success: false,
      );
    }
    buildPlan = plan;
  }
  final assets = <AssetImpl>[];
  var success = true;
  for (final package in buildPlan) {
    final config = await _cliConfigDryRun(
      packageName: package.name,
      packageRoot: packageLayout.packageRoot(package.name),
      targetOS: targetOS,
      linkMode: linkModePreference,
      buildParentDir: packageLayout.dartToolNativeAssetsBuilder,
      supportedAssetTypes: supportedAssetTypes,
    );
    final (packageAssets, _, _, packageSuccess) = await _buildPackage(
      config,
      packageLayout.packageConfigUri,
      workingDirectory,
      includeParentEnvironment,
      dryRun: true,
    );
    for (final asset in packageAssets) {
      switch (asset) {
        case NativeCodeAssetImpl _:
          if (asset.architecture != null) {
            // Backwards compatibility, if an architecture is provided use it.
            assets.add(asset);
          } else {
            // Dry run does not report architecture. Dart VM branches on OS
            // and Target when looking up assets, so populate assets for all
            // architectures.
            for (final architecture in asset.os.architectures) {
              assets.add(asset.copyWith(
                architecture: architecture,
              ));
            }
          }
        case DataAssetImpl _:
          assets.add(asset);
      }
    }
    success &= packageSuccess;
  }
  return _DryRunResultImpl(
    assets: assets,
    success: success,
  );
}