diff --git a/packages/flutter_tools/lib/src/dart/pub.dart b/packages/flutter_tools/lib/src/dart/pub.dart index defb78c1f29..8ce48344667 100644 --- a/packages/flutter_tools/lib/src/dart/pub.dart +++ b/packages/flutter_tools/lib/src/dart/pub.dart @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. + import 'package:meta/meta.dart'; import 'package:package_config/package_config.dart'; import 'package:process/process.dart'; @@ -15,6 +16,7 @@ import '../base/logger.dart'; import '../base/platform.dart'; import '../base/process.dart'; import '../cache.dart'; +import '../convert.dart'; import '../dart/package_map.dart'; import '../reporting/reporting.dart'; @@ -476,20 +478,28 @@ class _DefaultPub implements Pub { if (!generateSyntheticPackage) { return; } - final Package flutterGen = Package('flutter_gen', generatedDirectory.uri, languageVersion: LanguageVersion(2, 12)); if (packageConfig.packages.any((Package package) => package.name == 'flutter_gen')) { return; } - final PackageConfig newPackageConfig = PackageConfig( - [ - ...packageConfig.packages, - flutterGen, - ], - ); - // There is no current API for saving a package_config without hitting the real filesystem. - if (packageConfigFile.fileSystem is LocalFileSystem) { - await savePackageConfig(newPackageConfig, packageConfigFile.parent.parent); - } + + // TODO(jonahwillams): Using raw json manipulation here because + // savePackageConfig always writes to local io, and it changes absolute + // paths to relative on round trip. + // See: https://github.com/dart-lang/package_config/issues/99, + // and: https://github.com/dart-lang/package_config/issues/100. + + // Because [loadPackageConfigWithLogging] succeeded [packageConfigFile] + // we can rely on the file to exist and be correctly formatted. + final dynamic jsonContents = + json.decode(packageConfigFile.readAsStringSync()); + + jsonContents['packages'].add({ + 'name': 'flutter_gen', + 'rootUri': 'flutter_gen', + 'languageVersion': '2.12', + }); + + packageConfigFile.writeAsStringSync(json.encode(jsonContents)); } // Subset the package config file to only the parts that are relevant for diff --git a/packages/flutter_tools/test/general.shard/generate_localizations_test.dart b/packages/flutter_tools/test/general.shard/generate_localizations_test.dart index c14ca7ddaf6..bd8b011e950 100644 --- a/packages/flutter_tools/test/general.shard/generate_localizations_test.dart +++ b/packages/flutter_tools/test/general.shard/generate_localizations_test.dart @@ -2,7 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'dart:convert'; import 'dart:io'; import 'package:file/memory.dart'; @@ -10,6 +9,7 @@ import 'package:yaml/yaml.dart'; import 'package:flutter_tools/src/base/file_system.dart'; import 'package:flutter_tools/src/base/logger.dart'; +import 'package:flutter_tools/src/convert.dart'; import 'package:flutter_tools/src/globals.dart' as globals; import 'package:flutter_tools/src/localizations/gen_l10n.dart'; import 'package:flutter_tools/src/localizations/gen_l10n_types.dart'; diff --git a/packages/flutter_tools/test/integration.shard/flutter_gen_test.dart b/packages/flutter_tools/test/integration.shard/flutter_gen_test.dart index f18a8f6c8f7..f1b36a7c8a0 100644 --- a/packages/flutter_tools/test/integration.shard/flutter_gen_test.dart +++ b/packages/flutter_tools/test/integration.shard/flutter_gen_test.dart @@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'dart:convert'; + import 'package:file/file.dart'; import '../src/common.dart'; @@ -27,5 +29,21 @@ void main() { testWithoutContext('can correctly reference flutter generated code.', () async { await flutter.run(); + final dynamic jsonContent = json.decode(project.dir + .childDirectory('.dart_tool') + .childFile('package_config.json') + .readAsStringSync()); + final dynamic collection = jsonContent['packages'] + .firstWhere((dynamic e) => e['name'] == 'collection'); + expect( + Uri.parse(collection['rootUri'] as String).isAbsolute, + isTrue, + reason: 'The generated package_config.json should use absolute root urls', + ); + expect( + collection['packageUri'] as String, + 'lib/', + reason: 'The generated package_config.json should have package urls ending with /' + ); }); }