mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
[flutter_tools] Discover pubspec.yaml in parent directories (#48548)
This commit is contained in:
parent
3233252cb1
commit
c341d4b78f
@ -6,6 +6,7 @@ import 'dart:async';
|
|||||||
|
|
||||||
import 'package:args/args.dart';
|
import 'package:args/args.dart';
|
||||||
import 'package:args/command_runner.dart';
|
import 'package:args/command_runner.dart';
|
||||||
|
import 'package:file/file.dart';
|
||||||
import 'package:meta/meta.dart';
|
import 'package:meta/meta.dart';
|
||||||
import 'package:quiver/strings.dart';
|
import 'package:quiver/strings.dart';
|
||||||
|
|
||||||
@ -707,8 +708,20 @@ abstract class FlutterCommand extends Command<void> {
|
|||||||
Future<void> validateCommand() async {
|
Future<void> validateCommand() async {
|
||||||
if (_requiresPubspecYaml && !PackageMap.isUsingCustomPackagesPath) {
|
if (_requiresPubspecYaml && !PackageMap.isUsingCustomPackagesPath) {
|
||||||
// Don't expect a pubspec.yaml file if the user passed in an explicit .packages file path.
|
// Don't expect a pubspec.yaml file if the user passed in an explicit .packages file path.
|
||||||
if (!globals.fs.isFileSync('pubspec.yaml')) {
|
|
||||||
throw ToolExit(userMessages.flutterNoPubspec);
|
// If there is no pubspec in the current directory, look in the parent
|
||||||
|
// until one can be found.
|
||||||
|
bool changedDirectory = false;
|
||||||
|
while (!globals.fs.isFileSync('pubspec.yaml')) {
|
||||||
|
final Directory nextCurrent = globals.fs.currentDirectory.parent;
|
||||||
|
if (nextCurrent == null || nextCurrent.path == globals.fs.currentDirectory.path) {
|
||||||
|
throw ToolExit(userMessages.flutterNoPubspec);
|
||||||
|
}
|
||||||
|
globals.fs.currentDirectory = nextCurrent;
|
||||||
|
changedDirectory = true;
|
||||||
|
}
|
||||||
|
if (changedDirectory) {
|
||||||
|
globals.printStatus('Changing current working directory to: ${globals.fs.currentDirectory.path}');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate the current package map only if we will not be running "pub get" later.
|
// Validate the current package map only if we will not be running "pub get" later.
|
||||||
|
@ -125,6 +125,58 @@ void main() {
|
|||||||
DeviceManager: () => MockDeviceManager(),
|
DeviceManager: () => MockDeviceManager(),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
testUsingContext('Walks upward looking for a pubspec.yaml and succeeds if found', () async {
|
||||||
|
globals.fs.file('pubspec.yaml').createSync();
|
||||||
|
globals.fs.file('.packages')
|
||||||
|
..createSync()
|
||||||
|
..writeAsStringSync('Not a valid package');
|
||||||
|
|
||||||
|
globals.fs.currentDirectory = globals.fs.directory(globals.fs.path.join('a', 'b', 'c'))
|
||||||
|
..createSync(recursive: true);
|
||||||
|
|
||||||
|
final RunCommand command = RunCommand();
|
||||||
|
applyMocksToCommand(command);
|
||||||
|
try {
|
||||||
|
await createTestCommandRunner(command).run(<String>[
|
||||||
|
'run',
|
||||||
|
'--fast-start',
|
||||||
|
'--no-pub',
|
||||||
|
]);
|
||||||
|
fail('Expect exception');
|
||||||
|
} catch (e) {
|
||||||
|
expect(e, isInstanceOf<ToolExit>());
|
||||||
|
}
|
||||||
|
final BufferLogger bufferLogger = globals.logger as BufferLogger;
|
||||||
|
expect(bufferLogger.statusText, contains(
|
||||||
|
'Changing current working directory to:'
|
||||||
|
));
|
||||||
|
}, overrides: <Type, Generator>{
|
||||||
|
FileSystem: () => MemoryFileSystem(),
|
||||||
|
ProcessManager: () => FakeProcessManager.any(),
|
||||||
|
});
|
||||||
|
|
||||||
|
testUsingContext('Walks upward looking for a pubspec.yaml and exits if missing', () async {
|
||||||
|
globals.fs.currentDirectory = globals.fs.directory(globals.fs.path.join('a', 'b', 'c'))
|
||||||
|
..createSync(recursive: true);
|
||||||
|
|
||||||
|
final RunCommand command = RunCommand();
|
||||||
|
applyMocksToCommand(command);
|
||||||
|
try {
|
||||||
|
await createTestCommandRunner(command).run(<String>[
|
||||||
|
'run',
|
||||||
|
'--fast-start',
|
||||||
|
'--no-pub',
|
||||||
|
]);
|
||||||
|
fail('Expect exception');
|
||||||
|
} catch (e) {
|
||||||
|
expect(e, isInstanceOf<ToolExit>());
|
||||||
|
expect(e.toString(), contains('No pubspec.yaml file found'));
|
||||||
|
}
|
||||||
|
}, overrides: <Type, Generator>{
|
||||||
|
FileSystem: () => MemoryFileSystem(),
|
||||||
|
ProcessManager: () => FakeProcessManager.any(),
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
group('run app', () {
|
group('run app', () {
|
||||||
MemoryFileSystem fs;
|
MemoryFileSystem fs;
|
||||||
|
Loading…
Reference in New Issue
Block a user