mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
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.
This commit is contained in:
parent
b362d6f480
commit
178c87cc27
@ -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 /'
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user