Show parent pubspecs when a pubspec could not be found. (#4197)
diff --git a/lib/src/package.dart b/lib/src/package.dart
index 5685679..d7f8642 100644
--- a/lib/src/package.dart
+++ b/lib/src/package.dart
@@ -123,7 +123,7 @@
}
}
- /// Loads the package whose root directory is [packageDir].
+ /// Loads the package whose root directory is [dir].
///
/// Will also load the workspace sub-packages of this package (recursively).
///
@@ -162,20 +162,29 @@
withPubspecOverrides: withPubspecOverrides,
expectedName: expectedName,
);
- final workspacePackages = pubspec.workspace
- .map(
- (e) => Package.load(
- p.join(dir, e),
+
+ final workspacePackages = pubspec.workspace.map(
+ (workspacePath) {
+ try {
+ return Package.load(
+ p.join(dir, workspacePath),
sources,
loadPubspec: loadPubspec,
withPubspecOverrides: withPubspecOverrides,
- ),
- )
- .toList();
+ );
+ } on FileException catch (e) {
+ throw FileException(
+ '${e.message}\n'
+ 'That was included in the workspace of ${p.join(dir, 'pubspec.yaml')}.',
+ e.path,
+ );
+ }
+ },
+ ).toList();
for (final package in workspacePackages) {
if (package.pubspec.resolution != Resolution.workspace) {
fail('''
-${package.pubspecPath} is inluded in the workspace from ${p.join(dir, 'pubspec.yaml')}, but does not have `resolution: workspace`.
+${package.pubspecPath} is included in the workspace from ${p.join(dir, 'pubspec.yaml')}, but does not have `resolution: workspace`.
See $workspacesDocUrl for more information.
''');
diff --git a/test/workspace_test.dart b/test/workspace_test.dart
index 0ff5d4b..7bf8638 100644
--- a/test/workspace_test.dart
+++ b/test/workspace_test.dart
@@ -296,7 +296,7 @@
await pubGet(
environment: {'_PUB_TEST_SDK_VERSION': '3.7.0'},
error: contains(
- 'pkgs${s}a${s}pubspec.yaml is inluded in the workspace from .${s}pubspec.yaml, but does not have `resolution: workspace`.',
+ 'pkgs${s}a${s}pubspec.yaml is included in the workspace from .${s}pubspec.yaml, but does not have `resolution: workspace`.',
),
);
});
@@ -355,6 +355,38 @@
);
});
+ test('reports missing pubspec.yaml of workspace member correctly', () async {
+ await dir(appPath, [
+ libPubspec(
+ 'myapp',
+ '1.2.3',
+ extras: {
+ 'workspace': ['a'],
+ },
+ sdk: '^3.7.0',
+ ),
+ dir('a', [
+ libPubspec(
+ 'a',
+ '1.0.0',
+ resolutionWorkspace: true,
+ extras: {
+ 'workspace': ['b'], // Doesn't exist.
+ },
+ ),
+ ]),
+ ]).create();
+ await pubGet(
+ environment: {'_PUB_TEST_SDK_VERSION': '3.7.0'},
+ error: contains(
+ 'Could not find a file named "pubspec.yaml" in "${p.join(sandbox, appPath, 'a', 'b')}".\n'
+ 'That was included in the workspace of ${p.join('.', 'a', 'pubspec.yaml')}.\n'
+ 'That was included in the workspace of ${p.join('.', 'pubspec.yaml')}.',
+ ),
+ exitCode: NO_INPUT,
+ );
+ });
+
test('`pub deps` lists dependencies for all members of workspace', () async {
final server = await servePackages();
server.serve(