| Index: sdk/lib/_internal/pub/lib/src/command/build.dart
 | 
| diff --git a/sdk/lib/_internal/pub/lib/src/command/build.dart b/sdk/lib/_internal/pub/lib/src/command/build.dart
 | 
| index 2513d8b990021a7a46c07b7cce8c75f2f7dad560..51aba71c47495f5977e69ca756389bd25067db9f 100644
 | 
| --- a/sdk/lib/_internal/pub/lib/src/command/build.dart
 | 
| +++ b/sdk/lib/_internal/pub/lib/src/command/build.dart
 | 
| @@ -10,56 +10,38 @@ import 'package:barback/barback.dart';
 | 
|  import 'package:path/path.dart' as path;
 | 
|  
 | 
|  import '../barback/build_environment.dart';
 | 
| -import '../command.dart';
 | 
|  import '../exit_codes.dart' as exit_codes;
 | 
|  import '../io.dart';
 | 
|  import '../log.dart' as log;
 | 
|  import '../utils.dart';
 | 
| +import 'barback.dart';
 | 
|  
 | 
|  final _arrow = getSpecial('\u2192', '=>');
 | 
|  
 | 
| -/// The set of top level directories in the entrypoint package that can be
 | 
| -/// built.
 | 
| -final _allowedBuildDirectories = new Set<String>.from([
 | 
| -  "benchmark", "bin", "example", "test", "web"
 | 
| -]);
 | 
| -
 | 
|  /// Handles the `build` pub command.
 | 
| -class BuildCommand extends PubCommand {
 | 
| +class BuildCommand extends BarbackCommand {
 | 
|    String get description => "Apply transformers to build a package.";
 | 
|    String get usage => "pub build [options] [directories...]";
 | 
|    List<String> get aliases => const ["deploy", "settle-up"];
 | 
| -  bool get takesArguments => true;
 | 
|  
 | 
|    // TODO(nweiz): make this configurable.
 | 
|    /// The path to the application's build output directory.
 | 
|    String get target => 'build';
 | 
|  
 | 
| -  /// The build mode.
 | 
| -  BarbackMode get mode => new BarbackMode(commandOptions["mode"]);
 | 
| +  BarbackMode get defaultMode => BarbackMode.RELEASE;
 | 
| +
 | 
| +  List<String> get defaultSourceDirectories => ["web"];
 | 
|  
 | 
|    /// The number of files that have been built and written to disc so far.
 | 
|    int builtFiles = 0;
 | 
|  
 | 
| -  /// The names of the top-level build directories that will be built.
 | 
| -  final buildDirectories = new Set<String>();
 | 
| -
 | 
|    BuildCommand() {
 | 
|      commandParser.addOption("format",
 | 
|          help: "How output should be displayed.",
 | 
|          allowed: ["text", "json"], defaultsTo: "text");
 | 
| -
 | 
| -    commandParser.addOption("mode", defaultsTo: BarbackMode.RELEASE.toString(),
 | 
| -        help: "Mode to run transformers in.");
 | 
| -
 | 
| -    commandParser.addFlag("all", help: "Build all buildable directories.",
 | 
| -        defaultsTo: false, negatable: false);
 | 
|    }
 | 
|  
 | 
| -  Future onRun() {
 | 
| -    log.json.enabled = commandOptions["format"] == "json";
 | 
| -
 | 
| -    _parseBuildDirectories();
 | 
| +  Future onRunTransformerCommand() {
 | 
|      cleanDir(target);
 | 
|  
 | 
|      var errorsJson = [];
 | 
| @@ -97,7 +79,7 @@ class BuildCommand extends PubCommand {
 | 
|          // TODO(rnystrom): We don't actually need to bind servers for these, we
 | 
|          // just need to add them to barback's sources. Add support to
 | 
|          // BuildEnvironment for going the latter without the former.
 | 
| -        return Future.wait(buildDirectories.map(
 | 
| +        return Future.wait(sourceDirectories.map(
 | 
|              (dir) => environment.serveDirectory(dir))).then((_) {
 | 
|  
 | 
|            return environment.barback.getAllAssets();
 | 
| @@ -137,71 +119,6 @@ class BuildCommand extends PubCommand {
 | 
|      });
 | 
|    }
 | 
|  
 | 
| -  /// Parses the command-line arguments to determine the set of top-level
 | 
| -  /// directories to build.
 | 
| -  ///
 | 
| -  /// If there are no arguments to `pub build`, this will just be "web".
 | 
| -  ///
 | 
| -  /// If the `--all` flag is set, then it will be all buildable directories
 | 
| -  /// that exist.
 | 
| -  ///
 | 
| -  /// Otherwise, all arguments should be the names of directories to include.
 | 
| -  ///
 | 
| -  /// Throws an exception if the arguments are invalid.
 | 
| -  void _parseBuildDirectories() {
 | 
| -    if (commandOptions["all"]) {
 | 
| -      if (commandOptions.rest.isNotEmpty) {
 | 
| -        usageError(
 | 
| -            'Build directory names are not allowed if "--all" is passed.');
 | 
| -      }
 | 
| -
 | 
| -      // Include every build directory that exists in the package.
 | 
| -      var allowed = _allowedBuildDirectories.where(
 | 
| -          (d) => dirExists(path.join(entrypoint.root.dir, d)));
 | 
| -
 | 
| -      if (allowed.isEmpty) {
 | 
| -        var buildDirs = toSentence(ordered(_allowedBuildDirectories.map(
 | 
| -            (name) => '"$name"')));
 | 
| -        dataError('There are no buildable directories.\n'
 | 
| -                  'The supported directories are $buildDirs.');
 | 
| -      }
 | 
| -
 | 
| -      buildDirectories.addAll(allowed);
 | 
| -      return;
 | 
| -    }
 | 
| -
 | 
| -    buildDirectories.addAll(commandOptions.rest);
 | 
| -
 | 
| -    // If no directory were specified, default to "web".
 | 
| -    if (buildDirectories.isEmpty) {
 | 
| -      buildDirectories.add("web");
 | 
| -    }
 | 
| -
 | 
| -    // Make sure the arguments are known directories.
 | 
| -    var disallowed = buildDirectories.where(
 | 
| -        (dir) => !_allowedBuildDirectories.contains(dir));
 | 
| -    if (disallowed.isNotEmpty) {
 | 
| -      var dirs = pluralize("directory", disallowed.length,
 | 
| -          plural: "directories");
 | 
| -      var names = toSentence(ordered(disallowed).map((name) => '"$name"'));
 | 
| -      var allowed = toSentence(ordered(_allowedBuildDirectories.map(
 | 
| -          (name) => '"$name"')));
 | 
| -      usageError('Unsupported build $dirs $names.\n'
 | 
| -                 'The allowed directories are $allowed.');
 | 
| -    }
 | 
| -
 | 
| -    // Make sure all of the build directories exist.
 | 
| -    var missing = buildDirectories.where(
 | 
| -        (dir) => !dirExists(path.join(entrypoint.root.dir, dir)));
 | 
| -
 | 
| -    if (missing.length == 1) {
 | 
| -      dataError('Directory "${missing.single}" does not exist.');
 | 
| -    } else if (missing.isNotEmpty) {
 | 
| -      var names = toSentence(ordered(missing).map((name) => '"$name"'));
 | 
| -      dataError('Directories $names do not exist.');
 | 
| -    }
 | 
| -  }
 | 
| -
 | 
|    /// Writes [asset] to the appropriate build directory.
 | 
|    ///
 | 
|    /// If [asset] is in the special "assets" directory, writes it to every
 | 
| @@ -219,7 +136,7 @@ class BuildCommand extends PubCommand {
 | 
|      // top-level build directories.
 | 
|      if (path.isWithin("assets", destPath) ||
 | 
|          path.isWithin("packages", destPath)) {
 | 
| -      return Future.wait(buildDirectories.map((buildDir) =>
 | 
| +      return Future.wait(sourceDirectories.map((buildDir) =>
 | 
|            _writeOutputFile(asset, path.join(buildDir, destPath))));
 | 
|      }
 | 
|  
 | 
| 
 |