Handle missing pubspec.lock in dependency_services list (#3439)

diff --git a/lib/src/command/dependency_services.dart b/lib/src/command/dependency_services.dart
index 19cc867..5b252ae 100644
--- a/lib/src/command/dependency_services.dart
+++ b/lib/src/command/dependency_services.dart
@@ -281,7 +281,7 @@
     final dependencies = <Object>[];
     final result = <String, Object>{'dependencies': dependencies};
 
-    for (final package in currentPackages) {
+    for (final package in currentPackages.where((p) => !p.isRoot)) {
       dependencies.add({
         'name': package.name,
         'version': package.versionOrHash(),
diff --git a/test/dependency_services/dependency_services_test.dart b/test/dependency_services/dependency_services_test.dart
index b007a6b..08542ea 100644
--- a/test/dependency_services/dependency_services_test.dart
+++ b/test/dependency_services/dependency_services_test.dart
@@ -17,12 +17,18 @@
 
 void manifestAndLockfile(GoldenTestContext context) {
   String catFile(String filename) {
-    final contents = filterUnstableLines(
-        File(p.join(d.sandbox, appPath, filename)).readAsLinesSync());
+    final path = p.join(d.sandbox, appPath, filename);
+    if (File(path).existsSync()) {
+      final contents = filterUnstableLines(File(path).readAsLinesSync());
 
-    return '''
+      return '''
 \$ cat $filename
 ${contents.join('\n')}''';
+    } else {
+      return '''
+\$ cat $filename
+No such file $filename.''';
+    }
   }
 
   context.expectNextSection('''
@@ -141,6 +147,36 @@
     });
   });
 
+  testWithGolden('No pubspec.lock', (context) async {
+    final server = (await servePackages())
+      ..serve('foo', '1.2.3', deps: {'transitive': '^1.0.0'})
+      ..serve('foo', '2.2.3')
+      ..serve('transitive', '1.0.0');
+
+    await d.git('bar.git', [d.libPubspec('bar', '1.0.0')]).create();
+
+    await d.dir(appPath, [
+      d.pubspec({
+        'name': 'app',
+        'dependencies': {
+          'foo': '^1.0.0',
+          'bar': {
+            'git': {'url': '../bar.git'},
+          },
+        },
+      })
+    ]).create();
+
+    server.dontAllowDownloads();
+    await listReportApply(
+      context,
+      [
+        _PackageVersion('foo', '2.2.3'),
+        _PackageVersion('transitive', null),
+      ],
+    );
+  });
+
   testWithGolden('Compatible', (context) async {
     final server = (await servePackages())
       ..serve('foo', '1.2.3')
diff --git a/test/testdata/goldens/dependency_services/dependency_services_test/No pubspec.lock.txt b/test/testdata/goldens/dependency_services/dependency_services_test/No pubspec.lock.txt
new file mode 100644
index 0000000..ca80a34
--- /dev/null
+++ b/test/testdata/goldens/dependency_services/dependency_services_test/No pubspec.lock.txt
@@ -0,0 +1,205 @@
+# GENERATED BY: test/dependency_services/dependency_services_test.dart
+
+$ cat pubspec.yaml
+{"name":"app","dependencies":{"foo":"^1.0.0","bar":{"git":{"url":"../bar.git"}}},"environment":{"sdk":">=0.1.2 <1.0.0"}}
+$ cat pubspec.lock
+No such file pubspec.lock.
+-------------------------------- END OF OUTPUT ---------------------------------
+
+## Section list
+$ dependency_services list
+{
+  "dependencies": [
+    {
+      "name": "bar",
+      "version": "92cdd4ac724a6da0db2a69ac149820aa220e8518",
+      "kind": "direct",
+      "constraint": "any",
+      "source": {
+        "type": "git",
+        "description": {
+          "url": "../bar.git",
+          "ref": "HEAD",
+          "resolved-ref": "92cdd4ac724a6da0db2a69ac149820aa220e8518",
+          "path": "."
+        }
+      }
+    },
+    {
+      "name": "foo",
+      "version": "1.2.3",
+      "kind": "direct",
+      "constraint": "^1.0.0",
+      "source": {
+        "type": "hosted",
+        "description": {
+          "name": "foo",
+          "url": "http://localhost:$PORT"
+        }
+      }
+    },
+    {
+      "name": "transitive",
+      "version": "1.0.0",
+      "kind": "transitive",
+      "constraint": "null",
+      "source": {
+        "type": "hosted",
+        "description": {
+          "name": "transitive",
+          "url": "http://localhost:$PORT"
+        }
+      }
+    }
+  ]
+}
+
+-------------------------------- END OF OUTPUT ---------------------------------
+
+## Section report
+$ dependency_services report
+{
+  "dependencies": [
+    {
+      "name": "bar",
+      "version": "92cdd4ac724a6da0db2a69ac149820aa220e8518",
+      "kind": "direct",
+      "source": {
+        "type": "git",
+        "description": {
+          "url": "../bar.git",
+          "ref": "HEAD",
+          "resolved-ref": "92cdd4ac724a6da0db2a69ac149820aa220e8518",
+          "path": "."
+        }
+      },
+      "latest": "92cdd4ac724a6da0db2a69ac149820aa220e8518",
+      "constraint": "any",
+      "compatible": [],
+      "singleBreaking": [],
+      "multiBreaking": [
+        {
+          "name": "foo",
+          "version": "2.2.3",
+          "kind": "direct",
+          "source": {
+            "type": "hosted",
+            "description": {
+              "name": "foo",
+              "url": "http://localhost:$PORT"
+            }
+          },
+          "constraintBumped": "^2.2.3",
+          "constraintWidened": ">=1.0.0 <3.0.0",
+          "constraintBumpedIfNeeded": "^2.2.3",
+          "previousVersion": "1.2.3",
+          "previousConstraint": "^1.0.0",
+          "previousSource": {
+            "type": "hosted",
+            "description": {
+              "name": "foo",
+              "url": "http://localhost:$PORT"
+            }
+          }
+        }
+      ]
+    },
+    {
+      "name": "foo",
+      "version": "1.2.3",
+      "kind": "direct",
+      "source": {
+        "type": "hosted",
+        "description": {
+          "name": "foo",
+          "url": "http://localhost:$PORT"
+        }
+      },
+      "latest": "2.2.3",
+      "constraint": "^1.0.0",
+      "compatible": [],
+      "singleBreaking": [
+        {
+          "name": "foo",
+          "version": "2.2.3",
+          "kind": "direct",
+          "source": {
+            "type": "hosted",
+            "description": {
+              "name": "foo",
+              "url": "http://localhost:$PORT"
+            }
+          },
+          "constraintBumped": "^2.2.3",
+          "constraintWidened": ">=1.0.0 <3.0.0",
+          "constraintBumpedIfNeeded": "^2.2.3",
+          "previousVersion": "1.2.3",
+          "previousConstraint": "^1.0.0",
+          "previousSource": {
+            "type": "hosted",
+            "description": {
+              "name": "foo",
+              "url": "http://localhost:$PORT"
+            }
+          }
+        }
+      ],
+      "multiBreaking": [
+        {
+          "name": "foo",
+          "version": "2.2.3",
+          "kind": "direct",
+          "source": {
+            "type": "hosted",
+            "description": {
+              "name": "foo",
+              "url": "http://localhost:$PORT"
+            }
+          },
+          "constraintBumped": "^2.2.3",
+          "constraintWidened": ">=1.0.0 <3.0.0",
+          "constraintBumpedIfNeeded": "^2.2.3",
+          "previousVersion": "1.2.3",
+          "previousConstraint": "^1.0.0",
+          "previousSource": {
+            "type": "hosted",
+            "description": {
+              "name": "foo",
+              "url": "http://localhost:$PORT"
+            }
+          }
+        }
+      ]
+    },
+    {
+      "name": "transitive",
+      "version": "1.0.0",
+      "kind": "transitive",
+      "source": {
+        "type": "hosted",
+        "description": {
+          "name": "transitive",
+          "url": "http://localhost:$PORT"
+        }
+      },
+      "latest": "1.0.0",
+      "constraint": null,
+      "compatible": [],
+      "singleBreaking": [],
+      "multiBreaking": []
+    }
+  ]
+}
+
+-------------------------------- END OF OUTPUT ---------------------------------
+
+## Section apply
+$ echo '{"dependencyChanges":[{"name":"foo","version":"2.2.3"},{"name":"transitive","version":null}]}' | dependency_services apply
+{"dependencies":[]}
+
+-------------------------------- END OF OUTPUT ---------------------------------
+
+$ cat pubspec.yaml
+{"name":"app","dependencies":{"foo":^2.2.3,"bar":{"git":{"url":"../bar.git"}}},"environment":{"sdk":">=0.1.2 <1.0.0"}}
+$ cat pubspec.lock
+No such file pubspec.lock.