Skip to content

Commit 017ab97

Browse files
authored
Webdev: Look for pubspec.yaml next to .dart_tool/package_config.json instead of only current dir (#2498)
1 parent 5f30c56 commit 017ab97

File tree

6 files changed

+32
-33
lines changed

6 files changed

+32
-33
lines changed

webdev/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
- Update `dwds` constraint to `24.1.0`.
66

7+
- Support running from inside a pub workspace [#2498](https://github.com/dart-lang/webdev/pull/2498).
8+
79
## 3.5.0
810

911
- Update `dwds` constraint to `24.0.0`.

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: 22 additions & 20 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,17 +70,34 @@ 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);
8496
}
8597

8698
List<PackageExceptionDetails> checkPackage(
8799
String pkgName, VersionConstraint constraint,
88-
{String? forArgument, bool requireDirect = true}) {
100+
{String? forArgument}) {
89101
var issues = <PackageExceptionDetails>[];
90102
var missingDetails =
91103
PackageExceptionDetails.missingDep(pkgName, constraint);
@@ -95,13 +107,6 @@ class PubspecLock {
95107
if (pkgDataMap == null) {
96108
issues.add(missingDetails);
97109
} else {
98-
var dependency = pkgDataMap['dependency'] as String?;
99-
if (requireDirect &&
100-
dependency != null &&
101-
!dependency.startsWith('direct ')) {
102-
issues.add(missingDetails);
103-
}
104-
105110
var source = pkgDataMap['source'] as String?;
106111
if (source == 'hosted') {
107112
// NOTE: pkgDataMap['description'] should be:
@@ -133,7 +138,6 @@ Future<List<PackageExceptionDetails>> _validateBuildDaemonVersion(
133138
var buildDaemonIssues = pubspecLock.checkPackage(
134139
'build_daemon',
135140
VersionConstraint.parse(buildDaemonConstraint),
136-
requireDirect: false,
137141
);
138142

139143
// Only warn of build_daemon issues if they have a dependency on the package.
@@ -146,8 +150,7 @@ Future<List<PackageExceptionDetails>> _validateBuildDaemonVersion(
146150
// used by their application.
147151
if (info.isNewer &&
148152
pubspecLock
149-
.checkPackage('build_daemon', info.buildDaemonConstraint,
150-
requireDirect: false)
153+
.checkPackage('build_daemon', info.buildDaemonConstraint)
151154
.isEmpty) {
152155
issues.add(PackageExceptionDetails._('$issuePreamble\n'
153156
'A newer version of webdev is available which supports '
@@ -169,7 +172,6 @@ final buildWebCompilersConstraint = VersionConstraint.parse('^4.0.4');
169172
Future<void> checkPubspecLock(PubspecLock pubspecLock,
170173
{required bool requireBuildWebCompilers}) async {
171174
var issues = <PackageExceptionDetails>[];
172-
173175
var buildRunnerIssues =
174176
pubspecLock.checkPackage('build_runner', buildRunnerConstraint);
175177

0 commit comments

Comments
 (0)