Skip to content

Commit 2b360e1

Browse files
committed
Look for pubspec.yaml next to .dart_tool/package_config.json instead of only current dir
1 parent eccc7d8 commit 2b360e1

File tree

5 files changed

+28
-21
lines changed

5 files changed

+28
-21
lines changed

webdev/lib/src/command/build_command.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,8 @@ class BuildCommand extends Command<int> {
5252

5353
List<String> arguments;
5454
try {
55-
var pubspecLock = await readPubspecLock(configuration);
56-
arguments = buildRunnerArgs(pubspecLock, configuration)
57-
..addAll(validExtraArgs);
55+
await validatePubspecLock(configuration);
56+
arguments = buildRunnerArgs(configuration)..addAll(validExtraArgs);
5857
} on PackageException catch (e) {
5958
logWriter(logging.Level.SEVERE, 'Pubspec errors: ',
6059
error: '${e.details}');

webdev/lib/src/command/daemon_command.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,8 @@ class DaemonCommand extends Command<int> {
6666
launchInChrome: true, debug: true, autoRun: false, release: false));
6767
configureLogWriter(configuration.verbose);
6868
// Validate the pubspec first to ensure we are in a Dart project.
69-
PubspecLock? pubspecLock;
7069
try {
71-
pubspecLock = await readPubspecLock(configuration);
70+
await validatePubspecLock(configuration);
7271
} on PackageException catch (e) {
7372
logWriter(Level.SEVERE, 'Pubspec errors: ', error: '${e.details}');
7473
rethrow;
@@ -104,7 +103,7 @@ class DaemonCommand extends Command<int> {
104103
}
105104
});
106105
daemon.registerDomain(daemonDomain);
107-
var buildOptions = buildRunnerArgs(pubspecLock, configuration);
106+
var buildOptions = buildRunnerArgs(configuration);
108107
var extraArgs = argResults?.rest ?? [];
109108
var directoryArgs =
110109
extraArgs.where((arg) => !arg.startsWith('-')).toList();

webdev/lib/src/command/serve_command.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,16 +95,15 @@ refresh: Performs a full page refresh.
9595
Configuration configuration;
9696
configuration = Configuration.fromArgs(argResults);
9797
configureLogWriter(configuration.verbose);
98-
PubspecLock? pubspecLock;
9998
try {
100-
pubspecLock = await readPubspecLock(configuration);
99+
await validatePubspecLock(configuration);
101100
} on PackageException catch (e) {
102101
logWriter(Level.SEVERE, 'Pubspec errors: ', error: '${e.details}');
103102
rethrow;
104103
}
105104
// Forward remaining arguments as Build Options to the Daemon.
106105
// This isn't documented. Should it be advertised?
107-
var buildOptions = buildRunnerArgs(pubspecLock, configuration)
106+
var buildOptions = buildRunnerArgs(configuration)
108107
..addAll(argResults!.rest.where((arg) => arg.startsWith('-')).toList());
109108
var extraArgs = argResults?.rest ?? [];
110109
var directoryArgs = extraArgs.where((arg) => !arg.startsWith('-')).toList();

webdev/lib/src/command/shared.dart

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,7 @@ void addSharedArgs(ArgParser argParser,
7979

8080
/// Parses the provided [Configuration] to return a list of
8181
/// `package:build_runner` appropriate arguments.
82-
List<String> buildRunnerArgs(
83-
PubspecLock pubspecLock, Configuration configuration) {
82+
List<String> buildRunnerArgs(Configuration configuration) {
8483
var arguments = <String>[];
8584
if (configuration.release) {
8685
arguments.add('--$releaseFlag');
@@ -103,11 +102,10 @@ List<String> buildRunnerArgs(
103102
return arguments;
104103
}
105104

106-
Future<PubspecLock> readPubspecLock(Configuration configuration) async {
105+
Future<void> validatePubspecLock(Configuration configuration) async {
107106
var pubspecLock = await PubspecLock.read();
108107
await checkPubspecLock(pubspecLock,
109108
requireBuildWebCompilers: configuration.requireBuildWebCompilers);
110-
return pubspecLock;
111109
}
112110

113111
/// Checks that the normalized form of [path] is a top level directory under

webdev/lib/src/pubspec.dart

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'dart:convert';
77
import 'dart:io';
88

99
import 'package:http/http.dart';
10+
import 'package:path/path.dart' as p;
1011
import 'package:pub_semver/pub_semver.dart';
1112
import 'package:pubspec_parse/pubspec_parse.dart';
1213
import 'package:yaml/yaml.dart';
@@ -31,12 +32,6 @@ class PackageExceptionDetails {
3132
{this.description, bool missingDependency = false})
3233
: _missingDependency = missingDependency;
3334

34-
static const noPubspecLock =
35-
PackageExceptionDetails._('`pubspec.lock` does not exist.',
36-
description: 'Run `$appName` in a Dart package directory. '
37-
'Run `dart pub get` first.',
38-
missingDependency: true);
39-
4035
static PackageExceptionDetails missingDep(
4136
String pkgName, VersionConstraint constraint) =>
4237
PackageExceptionDetails._(
@@ -75,9 +70,26 @@ class PubspecLock {
7570

7671
static Future<PubspecLock> read() async {
7772
await _runPubDeps();
73+
var dir = p.absolute(p.current);
74+
while (true) {
75+
final candidate = p.join(
76+
dir,
77+
'.dart_tool',
78+
'package_config.json',
79+
);
80+
if (File(candidate).existsSync()) break;
81+
final next = p.dirname(dir);
82+
if (next == dir) {
83+
// Give up.
84+
dir = p.current;
85+
break;
86+
}
87+
dir = next;
88+
}
7889

79-
var pubspecLock =
80-
loadYaml(await File('pubspec.lock').readAsString()) as YamlMap;
90+
var pubspecLock = loadYaml(
91+
await File(p.relative(p.join(dir, 'pubspec.lock'))).readAsString())
92+
as YamlMap;
8193

8294
var packages = pubspecLock['packages'] as YamlMap?;
8395
return PubspecLock(packages);

0 commit comments

Comments
 (0)