dryRun method
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,
);
}