Skip to content

Commit 8ac2279

Browse files
dcharkesCommit Queue
authored and
Commit Queue
committed
[native assets] Graduate to preview
This PR enables native assets on the main and dev channel by default, and make native assets available on the beta channel. This PR removes the flag from invocations. The helper packages (`package:hooks` and `package:code_assets`) will stay 0.x for now, until the SDK constraint can be bumped to a beta release and we're happy with the Dart API. `dart build` is also made available as preview (without a flag on the main, dev, and beta channels). We're still finalizing the spec for this command. (#60730) `dart test` will need dart-lang/test#2501. This means users will need to update their `package:test` dependency. This PR refactors the way that invalid `package_config.json`s are handled: they are now loaded in the dartdev commands and handled there. Bug: #50565 Project: https://github.com/orgs/dart-lang/projects/99/ Change-Id: I7db9ff6d7196750cab9379a4605c6bbf89a974d7 Cq-Include-Trybots: luci.dart.try:pkg-linux-debug-try,pkg-linux-release-arm64-try,pkg-linux-release-try,pkg-mac-release-arm64-try,pkg-win-release-arm64-try,pkg-mac-release-try,pkg-win-release-try Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/429920 Commit-Queue: Daco Harkes <[email protected]> Reviewed-by: Martin Kustermann <[email protected]>
1 parent 59a5a36 commit 8ac2279

File tree

17 files changed

+103
-126
lines changed

17 files changed

+103
-126
lines changed

DEPS

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ vars = {
143143
"shelf_rev": "082d3ac2d13a98700d8148e8fad8f3e12a6fd0e1",
144144
"sync_http_rev": "dc54465f07d9652875deeade643256dafa2fbc6c",
145145
"tar_rev": "5a1ea943e70cdf3fa5e1102cdbb9418bd9b4b81a",
146-
"test_rev": "5ffcb36fd6c82843f25ed96585a4b9e96022e7f9",
146+
"test_rev": "42a6d333d96b4b0964d356b9a29ca47ccdb43691",
147147
"tools_rev": "36f5c9f9989e06e79323499914c50e78ab1a6621",
148148
"vector_math_rev": "13f185f7e97d559e003f5ac79201da12f9a01049",
149149
"web_rev": "f1becf07db9faa56559d2844c3c6d430dc9b37de",

pkg/_fe_analyzer_shared/lib/src/experiments/flags.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,10 @@ enum ExperimentalFlag {
159159

160160
nativeAssets(
161161
name: 'native-assets',
162-
isEnabledByDefault: false,
162+
isEnabledByDefault: true,
163163
isExpired: false,
164-
experimentEnabledVersion: defaultLanguageVersion,
165-
experimentReleasedVersion: defaultLanguageVersion),
164+
experimentEnabledVersion: const Version(3, 9),
165+
experimentReleasedVersion: const Version(3, 9)),
166166

167167
nonNullable(
168168
name: 'non-nullable',

pkg/analyzer/lib/src/dart/analysis/experiments.g.dart

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -428,8 +428,8 @@ class ExperimentalFeatures {
428428
isExpired: IsExpired.native_assets,
429429
documentation: 'Compile and bundle native assets.',
430430
experimentalReleaseVersion: null,
431-
releaseVersion: null,
432-
channels: ["main", "dev"],
431+
releaseVersion: Version.parse('3.9.0'),
432+
channels: ["main", "dev", "beta"],
433433
);
434434

435435
static final non_nullable = ExperimentalFeature(
@@ -690,7 +690,7 @@ class IsEnabledByDefault {
690690
static const bool named_arguments_anywhere = true;
691691

692692
/// Default state of the experiment "native-assets"
693-
static const bool native_assets = false;
693+
static const bool native_assets = true;
694694

695695
/// Default state of the experiment "non-nullable"
696696
static const bool non_nullable = true;

pkg/analyzer/test/src/dart/analysis/analysis_context_collection_test.dart

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,7 @@ analysisOptions
412412
inference-using-bounds
413413
inline-class
414414
named-arguments-anywhere
415+
native-assets
415416
non-nullable
416417
nonfunction-type-aliases
417418
null-aware-elements
@@ -491,6 +492,7 @@ analysisOptions
491492
inference-using-bounds
492493
inline-class
493494
named-arguments-anywhere
495+
native-assets
494496
non-nullable
495497
nonfunction-type-aliases
496498
null-aware-elements

pkg/dartdev/lib/src/commands/build.dart

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,10 @@ class BuildCommand extends DartdevCommand {
120120
return 128;
121121
}
122122

123+
stdout.writeln('''The `dart build` command is in preview at the moment.
124+
See documentation on https://dart.dev/interop/c-interop#native-assets.
125+
''');
126+
123127
final outputDir = Directory.fromUri(outputUri);
124128
if (await outputDir.exists()) {
125129
stdout.writeln('Deleting output directory: ${outputUri.toFilePath()}.');
@@ -128,17 +132,23 @@ class BuildCommand extends DartdevCommand {
128132
await outputDir.create(recursive: true);
129133

130134
stdout.writeln('Building native assets.');
131-
final packageConfig = await DartNativeAssetsBuilder.ensurePackageConfig(
135+
final packageConfigUri = await DartNativeAssetsBuilder.ensurePackageConfig(
132136
sourceUri,
133137
);
138+
final packageConfig =
139+
await DartNativeAssetsBuilder.loadPackageConfig(packageConfigUri!);
140+
if (packageConfig == null) {
141+
return compileErrorExitCode;
142+
}
134143
final runPackageName = await DartNativeAssetsBuilder.findRootPackageName(
135144
sourceUri,
136145
);
137146
final pubspecUri =
138-
await DartNativeAssetsBuilder.findWorkspacePubspec(packageConfig);
147+
await DartNativeAssetsBuilder.findWorkspacePubspec(packageConfigUri);
139148
final builder = DartNativeAssetsBuilder(
140149
pubspecUri: pubspecUri,
141-
packageConfigUri: packageConfig!,
150+
packageConfigUri: packageConfigUri,
151+
packageConfig: packageConfig,
142152
runPackageName: runPackageName!,
143153
verbose: verbose,
144154
);
@@ -163,7 +173,7 @@ class BuildCommand extends DartdevCommand {
163173
verbose: verbose,
164174
verbosity: args.option('verbosity')!,
165175
defines: [],
166-
packages: packageConfig.toFilePath(),
176+
packages: packageConfigUri.toFilePath(),
167177
targetOS: targetOS == null ? null : OS.fromString(targetOS),
168178
enableExperiment: args.enabledExperiments.join(','),
169179
tempDir: tempDir,

pkg/dartdev/lib/src/commands/compile.dart

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -610,19 +610,25 @@ Remove debugging information from the output and save it separately to the speci
610610
}
611611
}
612612

613-
final packageConfig = await DartNativeAssetsBuilder.ensurePackageConfig(
613+
final packageConfigUri = await DartNativeAssetsBuilder.ensurePackageConfig(
614614
Directory.current.uri,
615615
);
616-
if (packageConfig != null) {
616+
if (packageConfigUri != null) {
617+
final packageConfig =
618+
await DartNativeAssetsBuilder.loadPackageConfig(packageConfigUri);
619+
if (packageConfig == null) {
620+
return compileErrorExitCode;
621+
}
617622
final runPackageName = await DartNativeAssetsBuilder.findRootPackageName(
618623
Directory.current.uri,
619624
);
620625
if (runPackageName != null) {
621-
final pubspecUri =
622-
await DartNativeAssetsBuilder.findWorkspacePubspec(packageConfig);
626+
final pubspecUri = await DartNativeAssetsBuilder.findWorkspacePubspec(
627+
packageConfigUri);
623628
final builder = DartNativeAssetsBuilder(
624629
pubspecUri: pubspecUri,
625-
packageConfigUri: packageConfig,
630+
packageConfigUri: packageConfigUri,
631+
packageConfig: packageConfig,
626632
runPackageName: runPackageName,
627633
verbose: verbose,
628634
target: target);

pkg/dartdev/lib/src/commands/run.dart

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'dart:async';
66
import 'dart:io';
77

88
import 'package:args/args.dart';
9+
import 'package:dartdev/src/commands/compile.dart';
910
import 'package:front_end/src/api_prototype/compiler_options.dart'
1011
show Verbosity;
1112
import 'package:frontend_server/resident_frontend_server_utils.dart'
@@ -391,20 +392,26 @@ class RunCommand extends DartdevCommand {
391392
}
392393

393394
String? nativeAssets;
394-
final packageConfig = await DartNativeAssetsBuilder.ensurePackageConfig(
395+
final packageConfigUri = await DartNativeAssetsBuilder.ensurePackageConfig(
395396
Directory.current.uri,
396397
);
397-
if (packageConfig != null) {
398+
if (packageConfigUri != null) {
399+
final packageConfig =
400+
await DartNativeAssetsBuilder.loadPackageConfig(packageConfigUri);
401+
if (packageConfig == null) {
402+
return compileErrorExitCode;
403+
}
398404
final runPackageName = getPackageForCommand(mainCommand) ??
399405
await DartNativeAssetsBuilder.findRootPackageName(
400406
Directory.current.uri,
401407
);
402408
if (runPackageName != null) {
403-
final pubspecUri =
404-
await DartNativeAssetsBuilder.findWorkspacePubspec(packageConfig);
409+
final pubspecUri = await DartNativeAssetsBuilder.findWorkspacePubspec(
410+
packageConfigUri);
405411
final builder = DartNativeAssetsBuilder(
406412
pubspecUri: pubspecUri,
407-
packageConfigUri: packageConfig,
413+
packageConfigUri: packageConfigUri,
414+
packageConfig: packageConfig,
408415
runPackageName: runPackageName,
409416
verbose: verbose,
410417
);

pkg/dartdev/lib/src/commands/test.dart

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,19 +47,25 @@ Run "${runner!.executableName} help" to see global options.''');
4747
final args = argResults!;
4848

4949
String? nativeAssets;
50-
final packageConfig = await DartNativeAssetsBuilder.ensurePackageConfig(
50+
final packageConfigUri = await DartNativeAssetsBuilder.ensurePackageConfig(
5151
Directory.current.uri,
5252
);
53-
if (packageConfig != null) {
53+
if (packageConfigUri != null) {
54+
final packageConfig =
55+
await DartNativeAssetsBuilder.loadPackageConfig(packageConfigUri);
56+
if (packageConfig == null) {
57+
return DartdevCommand.errorExitCode;
58+
}
5459
final runPackageName = await DartNativeAssetsBuilder.findRootPackageName(
5560
Directory.current.uri,
5661
);
5762
if (runPackageName != null) {
58-
final pubspecUri =
59-
await DartNativeAssetsBuilder.findWorkspacePubspec(packageConfig);
63+
final pubspecUri = await DartNativeAssetsBuilder.findWorkspacePubspec(
64+
packageConfigUri);
6065
final builder = DartNativeAssetsBuilder(
6166
pubspecUri: pubspecUri,
62-
packageConfigUri: packageConfig,
67+
packageConfigUri: packageConfigUri,
68+
packageConfig: packageConfig,
6369
runPackageName: runPackageName,
6470
verbose: verbose,
6571
);
@@ -78,7 +84,7 @@ Run "${runner!.executableName} help" to see global options.''');
7884
// package:test to explicitly provide the native_assets.yaml path
7985
// instead of copying to the workspace .dart_tool.
8086
final expectedPackageTestLocation =
81-
packageConfig.resolve('native_assets.yaml');
87+
packageConfigUri.resolve('native_assets.yaml');
8288
if (expectedPackageTestLocation != assetsYamlFileUri) {
8389
await File.fromUri(assetsYamlFileUri)
8490
.copy(expectedPackageTestLocation.toFilePath());

pkg/dartdev/lib/src/experiments.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,9 @@ List<String> parseVmEnabledExperiments(List<String> vmArgs) {
9898

9999
bool nativeAssetsEnabled(List<String> vmEnabledExperiments) =>
100100
vmEnabledExperiments
101-
.contains(ExperimentalFeatures.native_assets.enableString);
101+
.contains(ExperimentalFeatures.native_assets.enableString) ||
102+
(_availableOnCurrentChannel(ExperimentalFeatures.native_assets.channels) &&
103+
ExperimentalFeatures.native_assets.isEnabledByDefault);
102104

103105
bool recordUseEnabled(List<String> vmEnabledExperiments) =>
104106
vmEnabledExperiments.contains(ExperimentalFeatures.record_use.enableString);

pkg/dartdev/lib/src/native_assets.dart

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import 'core.dart';
2222
class DartNativeAssetsBuilder {
2323
final Uri? pubspecUri;
2424
final Uri packageConfigUri;
25+
final package_config.PackageConfig packageConfig;
2526
final String runPackageName;
2627
final bool verbose;
2728

@@ -30,7 +31,7 @@ class DartNativeAssetsBuilder {
3031
late final Future<PackageLayout> _packageLayout = () async {
3132
return PackageLayout.fromPackageConfig(
3233
_fileSystem,
33-
await package_config.loadPackageConfigUri(packageConfigUri),
34+
packageConfig,
3435
packageConfigUri,
3536
runPackageName,
3637
);
@@ -65,6 +66,7 @@ class DartNativeAssetsBuilder {
6566
DartNativeAssetsBuilder({
6667
this.pubspecUri,
6768
required this.packageConfigUri,
69+
required this.packageConfig,
6870
required this.runPackageName,
6971
required this.verbose,
7072
Target? target,
@@ -112,27 +114,14 @@ class DartNativeAssetsBuilder {
112114
}
113115

114116
Future<bool> warnOnNativeAssets() async {
115-
try {
116-
final builder = await _nativeAssetsBuildRunner;
117-
final packageNames = await builder.packagesWithBuildHooks();
118-
if (packageNames.isEmpty) return false;
119-
log.stderr(
120-
'Package(s) $packageNames require the native assets feature to be enabled. '
121-
'Enable native assets with `--enable-experiment=native-assets`.',
122-
);
123-
return true;
124-
} on FormatException catch (e) {
125-
// This can be thrown if the package_config.json is malformed or has
126-
// duplicate entries.
127-
log.stderr(
128-
'Error encountered while parsing '
129-
'${packageConfigUri.toFilePath()}: ${e.message}.',
130-
);
131-
// If the package config cannot be read, don't fail here. The dartdev
132-
// command invoking this function can fail if it requires to have a valid
133-
// package config.
134-
return false;
135-
}
117+
final builder = await _nativeAssetsBuildRunner;
118+
final packageNames = await builder.packagesWithBuildHooks();
119+
if (packageNames.isEmpty) return false;
120+
log.stderr(
121+
'Package(s) $packageNames require the native assets feature to be enabled. '
122+
'Enable native assets with `--enable-experiment=native-assets`.',
123+
);
124+
return true;
136125
}
137126

138127
late final _extensions = [
@@ -245,6 +234,24 @@ class DartNativeAssetsBuilder {
245234
return packageConfig;
246235
}
247236

237+
/// Tries to load the package config.
238+
///
239+
/// Returns null and writes to stderr if the package config is malformed.
240+
static Future<package_config.PackageConfig?> loadPackageConfig(
241+
Uri packageConfigUri) async {
242+
try {
243+
return await package_config.loadPackageConfigUri(packageConfigUri);
244+
} on FormatException catch (e) {
245+
// This can be thrown if the package_config.json is malformed or has
246+
// duplicate entries.
247+
log.stderr(
248+
'Error encountered while parsing '
249+
'${packageConfigUri.toFilePath()}: ${e.message}.',
250+
);
251+
return null;
252+
}
253+
}
254+
248255
/// Finds the package config uri.
249256
///
250257
/// Returns `null` if no package config can be found.

pkg/dartdev/test/native_assets/build_test.dart

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ void main([List<String> args = const []]) async {
4949
final bool expectCrossOSFailure = targetOS == crossOS;
5050
final result = await runDart(
5151
arguments: [
52-
'--enable-experiment=native-assets',
5352
if (fromDartdevSource) dartDevEntryScriptUri.toFilePath(),
5453
'build',
5554
if (targetOS != null) ...[
@@ -115,7 +114,6 @@ void main(List<String> args) {
115114
''');
116115
final result = await runDart(
117116
arguments: [
118-
'--enable-experiment=native-assets',
119117
'build',
120118
'bin/dart_app.dart',
121119
],
@@ -137,7 +135,6 @@ void main(List<String> args) {
137135
await nativeAssetsTest('native_add_duplicate', (dartAppUri) async {
138136
final result = await runDart(
139137
arguments: [
140-
'--enable-experiment=native-assets',
141138
'build',
142139
'bin/native_add_duplicate.dart',
143140
],
@@ -159,7 +156,6 @@ void main(List<String> args) {
159156
await nativeAssetsTest('drop_dylib_link', (dartAppUri) async {
160157
await runDart(
161158
arguments: [
162-
'--enable-experiment=native-assets',
163159
'build',
164160
'bin/drop_dylib_link.dart',
165161
],
@@ -190,7 +186,6 @@ void main(List<String> args) {
190186
await nativeAssetsTest('add_asset_link', (dartAppUri) async {
191187
final result = await runDart(
192188
arguments: [
193-
'--enable-experiment=native-assets',
194189
'build',
195190
'bin/add_asset_link.dart',
196191
],
@@ -219,7 +214,6 @@ void main(List<String> args) {
219214
await nativeAssetsTest('dart_app', (dartAppUri) async {
220215
final result = await runDart(
221216
arguments: [
222-
'--enable-experiment=native-assets',
223217
if (fromDartdevSource) dartDevEntryScriptUri.toFilePath(),
224218
'build',
225219
'bin/dart_app.dart',
@@ -252,7 +246,7 @@ void main(List<String> args) {
252246

253247
await runDart(
254248
arguments: [
255-
'--enable-experiment=native-assets,record-use',
249+
'--enable-experiment=record-use',
256250
'build',
257251
'bin/$filename.dart',
258252
],
@@ -295,7 +289,6 @@ void main(List<String> args) {
295289
await nativeAssetsTest('native_dynamic_linking', (packageUri) async {
296290
await runDart(
297291
arguments: [
298-
'--enable-experiment=native-assets',
299292
'build',
300293
'bin/native_dynamic_linking.dart',
301294
],
@@ -337,7 +330,6 @@ void main(List<String> args) {
337330
(packageUri) async {
338331
await runDart(
339332
arguments: [
340-
'--enable-experiment=native-assets',
341333
'build',
342334
'bin/user_defines.dart',
343335
],

0 commit comments

Comments
 (0)