| // Copyright 2014 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'dart:isolate'; |
| import 'dart:typed_data'; |
| |
| import 'package:package_config/package_config.dart'; |
| |
| import '../base/common.dart'; |
| import '../base/file_system.dart'; |
| import '../base/logger.dart'; |
| |
| /// Loads the package configuration of the current isolate. |
| Future<PackageConfig> currentPackageConfig() async { |
| return loadPackageConfigUri(Isolate.packageConfigSync!); |
| } |
| |
| /// Locates the `.dart_tool/package_config.json` relevant to [dir]. |
| /// |
| /// Searches [dir] and all parent directories. |
| /// |
| /// Returns `null` if no package_config.json was found. |
| // TODO(sigurdm): Only call this once per run - and read in from BuildInfo. |
| File? findPackageConfigFile(Directory dir) { |
| final FileSystem fileSystem = dir.fileSystem; |
| Directory candidateDir = fileSystem.directory(fileSystem.path.normalize(dir.absolute.path)); |
| |
| while (true) { |
| final File candidatePackageConfigFile = candidateDir |
| .childDirectory('.dart_tool') |
| .childFile('package_config.json'); |
| if (candidatePackageConfigFile.existsSync()) { |
| return candidatePackageConfigFile; |
| } |
| final Directory parentDir = candidateDir.parent; |
| if (fileSystem.path.equals(parentDir.path, candidateDir.path)) { |
| return null; |
| } |
| candidateDir = parentDir; |
| } |
| } |
| |
| /// Locates the `.dart_tool/package_config.json` relevant to [dir]. |
| /// |
| /// Like [findPackageConfigFile] but returns |
| /// `$dir/.dart_tool/package_config.json` if no package config could be found. |
| File findPackageConfigFileOrDefault(Directory dir) { |
| return findPackageConfigFile(dir) ?? |
| dir.childDirectory('.dart_tool').childFile('package_config.json'); |
| } |
| |
| /// Load the package configuration from [file] or throws a [ToolExit] |
| /// if the operation would fail. |
| /// |
| /// If [throwOnError] is false, in the event of an error an empty package |
| /// config is returned. |
| Future<PackageConfig> loadPackageConfigWithLogging( |
| File file, { |
| required Logger logger, |
| bool throwOnError = true, |
| }) async { |
| final FileSystem fileSystem = file.fileSystem; |
| var didError = false; |
| final PackageConfig result = await loadPackageConfigUri( |
| file.absolute.uri, |
| loader: (Uri uri) async { |
| final File configFile = fileSystem.file(uri); |
| if (!configFile.existsSync()) { |
| return null; |
| } |
| return Future<Uint8List>.value(configFile.readAsBytesSync()); |
| }, |
| onError: (dynamic error) { |
| if (!throwOnError) { |
| return; |
| } |
| logger.printTrace(error.toString()); |
| var message = '${file.path} does not exist.'; |
| final String pubspecPath = fileSystem.path.absolute( |
| fileSystem.path.dirname(file.path), |
| 'pubspec.yaml', |
| ); |
| if (fileSystem.isFileSync(pubspecPath)) { |
| message += '\nDid you run "flutter pub get" in this directory?'; |
| } else { |
| message += '\nDid you run this command from the same directory as your pubspec.yaml file?'; |
| } |
| logger.printError(message); |
| didError = true; |
| }, |
| ); |
| if (didError) { |
| throwToolExit(''); |
| } |
| return result; |
| } |