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 @@
// 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(
<Package>[
...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(<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
......
......@@ -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';
......
......@@ -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 /'
);
});
}
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