@@ -7,6 +7,7 @@ import 'dart:convert';
7
7
import 'dart:io' ;
8
8
9
9
import 'package:http/http.dart' ;
10
+ import 'package:path/path.dart' as p;
10
11
import 'package:pub_semver/pub_semver.dart' ;
11
12
import 'package:pubspec_parse/pubspec_parse.dart' ;
12
13
import 'package:yaml/yaml.dart' ;
@@ -31,12 +32,6 @@ class PackageExceptionDetails {
31
32
{this .description, bool missingDependency = false })
32
33
: _missingDependency = missingDependency;
33
34
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
-
40
35
static PackageExceptionDetails missingDep (
41
36
String pkgName, VersionConstraint constraint) =>
42
37
PackageExceptionDetails ._(
@@ -75,9 +70,26 @@ class PubspecLock {
75
70
76
71
static Future <PubspecLock > read () async {
77
72
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
+ }
78
89
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 ;
81
93
82
94
var packages = pubspecLock['packages' ] as YamlMap ? ;
83
95
return PubspecLock (packages);
0 commit comments