diff --git a/webdev/lib/src/command/build_command.dart b/webdev/lib/src/command/build_command.dart index a09bb441f..9965c27bc 100644 --- a/webdev/lib/src/command/build_command.dart +++ b/webdev/lib/src/command/build_command.dart @@ -1,29 +1,17 @@ import 'dart:async'; + import 'package:io/io.dart'; -import 'package:args/command_runner.dart'; +import 'build_runner_command_base.dart'; /// Command to execute pub run build_runner build. -class BuildCommand extends Command { +class BuildCommand extends BuildRunnerCommandBase { @override final name = 'build'; @override final description = 'Run builders to build a package.'; - BuildCommand() { - // TODO(nshahan) Expose more args passed to build_runner build. - // build_runner might expose args for use in wrapping scripts like this one. - argParser - ..addOption('output', - abbr: 'o', help: 'A directory to write the result of a build to.') - ..addFlag('verbose', - abbr: 'v', - defaultsTo: false, - negatable: false, - help: 'Enables verbose logging.'); - } - @override Future run() async { final manager = new ProcessManager(); diff --git a/webdev/lib/src/command/build_runner_command_base.dart b/webdev/lib/src/command/build_runner_command_base.dart new file mode 100644 index 000000000..d66f7904c --- /dev/null +++ b/webdev/lib/src/command/build_runner_command_base.dart @@ -0,0 +1,18 @@ +import 'package:args/command_runner.dart'; + +/// Extend to get a command with the arguments common to all build_runner +/// commands. +abstract class BuildRunnerCommandBase extends Command { + BuildRunnerCommandBase() { + // TODO(nshahan) Expose more common args passed to build_runner commands. + // build_runner might expose args for use in wrapping scripts like this one. + argParser + ..addOption('output', + abbr: 'o', help: 'A directory to write the result of a build to.') + ..addFlag('verbose', + abbr: 'v', + defaultsTo: false, + negatable: false, + help: 'Enables verbose logging.'); + } +} diff --git a/webdev/lib/src/command/serve_command.dart b/webdev/lib/src/command/serve_command.dart new file mode 100644 index 000000000..221a98909 --- /dev/null +++ b/webdev/lib/src/command/serve_command.dart @@ -0,0 +1,35 @@ +import 'dart:async'; + +import 'package:io/io.dart'; + +import 'build_runner_command_base.dart'; + +/// Command to execute pub run build_runner serve. +class ServeCommand extends BuildRunnerCommandBase { + @override + final name = 'serve'; + + @override + final description = 'Run a local web development server and a file system' + ' watcher that re-builds on changes.'; + + ServeCommand() { + // TODO(nshahan) Expose more args passed to build_runner serve. + // build_runner might expose args for use in wrapping scripts like this one. + argParser + ..addOption('hostname', + defaultsTo: 'localhost', help: 'Specify the hostname to serve on.'); + } + + @override + Future run() async { + final manager = new ProcessManager(); + final executable = 'pub'; + final arguments = ['run', 'build_runner', 'serve', '--assume-tty']; + arguments.addAll(argResults.arguments); + var spawn = await manager.spawn(executable, arguments); + + await spawn.exitCode; + await sharedStdIn.terminate(); + } +} diff --git a/webdev/lib/src/webdev_command_runner.dart b/webdev/lib/src/webdev_command_runner.dart index fd90bfb0c..1dbdd4133 100644 --- a/webdev/lib/src/webdev_command_runner.dart +++ b/webdev/lib/src/webdev_command_runner.dart @@ -1,13 +1,10 @@ import 'package:args/command_runner.dart'; import 'command/build_command.dart'; +import 'command/serve_command.dart'; /// All available top level commands. -CommandRunner webdevCommandRunner() { - final commandRunner = - new CommandRunner('webdev', 'A tool to develop Dart web projects.'); - - commandRunner.addCommand(new BuildCommand()); - - return commandRunner; -} +CommandRunner webdevCommandRunner() => + new CommandRunner('webdev', 'A tool to develop Dart web projects.') + ..addCommand(new BuildCommand()) + ..addCommand(new ServeCommand());