Unverified Commit 178c87cc authored by Sigurd Meldgaard's avatar Sigurd Meldgaard Committed by GitHub

Avoid relative paths in .dart_tool/package_config.json when generate:true (#73944)

Instead of using package:package_config to write the .dart_tool/package_config the original json is modified and rewritten.

The .dart_tool/package_config.json file is read twice to simplify control flow.

This also avoids the issue of package:package_config writing directly to local filesystem.
parent b362d6f4
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
import 'package:meta/meta.dart'; import 'package:meta/meta.dart';
import 'package:package_config/package_config.dart'; import 'package:package_config/package_config.dart';
import 'package:process/process.dart'; import 'package:process/process.dart';
...@@ -15,6 +16,7 @@ import '../base/logger.dart'; ...@@ -15,6 +16,7 @@ import '../base/logger.dart';
import '../base/platform.dart'; import '../base/platform.dart';
import '../base/process.dart'; import '../base/process.dart';
import '../cache.dart'; import '../cache.dart';
import '../convert.dart';
import '../dart/package_map.dart'; import '../dart/package_map.dart';
import '../reporting/reporting.dart'; import '../reporting/reporting.dart';
...@@ -476,20 +478,28 @@ class _DefaultPub implements Pub { ...@@ -476,20 +478,28 @@ class _DefaultPub implements Pub {
if (!generateSyntheticPackage) { if (!generateSyntheticPackage) {
return; return;
} }
final Package flutterGen = Package('flutter_gen', generatedDirectory.uri, languageVersion: LanguageVersion(2, 12));
if (packageConfig.packages.any((Package package) => package.name == 'flutter_gen')) { if (packageConfig.packages.any((Package package) => package.name == 'flutter_gen')) {
return; return;
} }
final PackageConfig newPackageConfig = PackageConfig(
<Package>[ // TODO(jonahwillams): Using raw json manipulation here because
...packageConfig.packages, // savePackageConfig always writes to local io, and it changes absolute
flutterGen, // 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.
// There is no current API for saving a package_config without hitting the real filesystem.
if (packageConfigFile.fileSystem is LocalFileSystem) { // Because [loadPackageConfigWithLogging] succeeded [packageConfigFile]
await savePackageConfig(newPackageConfig, packageConfigFile.parent.parent); // we can rely on the file to exist and be correctly formatted.
} final dynamic jsonContents =
json.decode(packageConfigFile.readAsStringSync());
jsonContents['packages'].add(<String, dynamic>{
'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 // Subset the package config file to only the parts that are relevant for
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'package:file/memory.dart'; import 'package:file/memory.dart';
...@@ -10,6 +9,7 @@ import 'package:yaml/yaml.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/file_system.dart';
import 'package:flutter_tools/src/base/logger.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/globals.dart' as globals;
import 'package:flutter_tools/src/localizations/gen_l10n.dart'; import 'package:flutter_tools/src/localizations/gen_l10n.dart';
import 'package:flutter_tools/src/localizations/gen_l10n_types.dart'; import 'package:flutter_tools/src/localizations/gen_l10n_types.dart';
......
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
import 'dart:convert';
import 'package:file/file.dart'; import 'package:file/file.dart';
import '../src/common.dart'; import '../src/common.dart';
...@@ -27,5 +29,21 @@ void main() { ...@@ -27,5 +29,21 @@ void main() {
testWithoutContext('can correctly reference flutter generated code.', () async { testWithoutContext('can correctly reference flutter generated code.', () async {
await flutter.run(); 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 /'
);
}); });
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment