blob: c12d714d514a65ff7ca1f54f9919b99e648a3bcc [file] [log] [blame]
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:args/command_runner.dart';
import 'src/entrypoint.dart';
import 'src/exceptions.dart';
import 'src/http.dart';
import 'src/pub_embeddable_command.dart';
import 'src/system_cache.dart';
export 'src/executable.dart'
show
getExecutableForCommand,
CommandResolutionFailedException,
CommandResolutionIssue,
DartExecutableWithPackageConfig;
/// Returns a [Command] for pub functionality that can be used by an embedding
/// CommandRunner.
///
/// [isVerbose] should return `true` (after argument resolution) if the
/// embedding top-level is in verbose mode.
Command<int> pubCommand({required bool Function() isVerbose}) =>
PubEmbeddableCommand(isVerbose);
/// Makes sure that [dir]/pubspec.yaml is resolved such that pubspec.lock and
/// .dart_tool/package_config.json are up-to-date and all packages are
/// downloaded to the cache.
///
/// Will compare file timestamps to see if full resolution can be skipped.
///
/// If [summaryOnly] is `true` (the default) only a short summary is shown of
/// the solve.
///
/// If [onlyOutputWhenTerminal] is `true` (the default) there will be no
/// output if no terminal is attached.
///
/// Throws a [ResolutionFailedException] if resolution fails.
Future<void> ensurePubspecResolved(
String dir, {
bool isOffline = false,
bool summaryOnly = true,
bool onlyOutputWhenTerminal = true,
}) async {
try {
await Entrypoint.ensureUpToDate(
dir,
cache: SystemCache(isOffline: isOffline),
summaryOnly: summaryOnly,
onlyOutputWhenTerminal: onlyOutputWhenTerminal,
);
} on ApplicationException catch (e) {
throw ResolutionFailedException._(e.toString());
} finally {
// TODO(https://github.com/dart-lang/pub/issues/4200)
// This is a bit of a hack.
// We should most likely take a client here.
globalHttpClient.close();
}
}
class ResolutionFailedException implements Exception {
String message;
ResolutionFailedException._(this.message);
}