// 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 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 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.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; }