Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(677)

Unified Diff: sdk/lib/_internal/pub/lib/src/command/build.dart

Issue 1165473002: Start pulling pub from its own repo. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Code review changes Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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
deleted file mode 100644
index b07cd95d617b7c054fd607f49dba7d198cf5dc3c..0000000000000000000000000000000000000000
--- a/sdk/lib/_internal/pub/lib/src/command/build.dart
+++ /dev/null
@@ -1,268 +0,0 @@
-// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library pub.command.build;
-
-import 'dart:async';
-
-import 'package:barback/barback.dart';
-import 'package:path/path.dart' as path;
-
-import '../barback/asset_environment.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', '=>');
-
-/// Handles the `build` pub command.
-class BuildCommand extends BarbackCommand {
- String get name => "build";
- String get description => "Apply transformers to build a package.";
- String get invocation => "pub build [options] [directories...]";
- String get docUrl => "http://dartlang.org/tools/pub/cmd/pub-build.html";
- List<String> get aliases => const ["deploy", "settle-up"];
-
- /// The path to the application's build output directory.
- String get outputDirectory => argResults["output"];
-
- List<String> get defaultSourceDirectories => ["web"];
-
- /// The number of files that have been built and written to disc so far.
- int builtFiles = 0;
-
- BuildCommand() {
- argParser.addOption("define", abbr: "D",
- help: "Defines an environment constant for dart2js.",
- allowMultiple: true, splitCommas: false);
-
- argParser.addOption("format",
- help: "How output should be displayed.",
- allowed: ["text", "json"], defaultsTo: "text");
-
- argParser.addOption("output", abbr: "o",
- help: "Directory to write build outputs to.",
- defaultsTo: "build");
- }
-
- Future onRunTransformerCommand() async {
- cleanDir(outputDirectory);
-
- var errorsJson = [];
- var logJson = [];
-
- var environmentConstants = new Map.fromIterable(argResults["define"],
- key: (pair) => pair.split("=").first,
- value: (pair) => pair.split("=").last);
-
- // Since this server will only be hit by the transformer loader and isn't
- // user-facing, just use an IPv4 address to avoid a weird bug on the
- // OS X buildbots.
- return AssetEnvironment.create(entrypoint, mode,
- environmentConstants: environmentConstants,
- useDart2JS: true)
- .then((environment) {
- // Show in-progress errors, but not results. Those get handled
- // implicitly by getAllAssets().
- environment.barback.errors.listen((error) {
- log.error(log.red("Build error:\n$error"));
-
- if (log.json.enabled) {
- // Wrap the error in a map in case we end up decorating it with
- // more properties later.
- errorsJson.add({
- "error": error.toString()
- });
- }
- });
-
- // If we're using JSON output, the regular server logging is disabled.
- // Instead, we collect it here to include in the final JSON result.
- if (log.json.enabled) {
- environment.barback.log.listen(
- (entry) => logJson.add(_logEntryToJson(entry)));
- }
-
- return log.progress("Building ${entrypoint.root.name}", () {
- // Register all of the build directories.
- // 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(sourceDirectories.map(
- (dir) => environment.serveDirectory(dir))).then((_) {
-
- return environment.barback.getAllAssets();
- });
- }).then((assets) {
- // Find all of the JS entrypoints we built.
- var dart2JSEntrypoints = assets
- .where((asset) => asset.id.path.endsWith(".dart.js"))
- .map((asset) => asset.id);
-
- return Future.wait(assets.map(_writeAsset)).then((_) {
- return _copyBrowserJsFiles(dart2JSEntrypoints, assets);
- }).then((_) {
- log.message('Built $builtFiles ${pluralize('file', builtFiles)} '
- 'to "$outputDirectory".');
-
- log.json.message({
- "buildResult": "success",
- "outputDirectory": outputDirectory,
- "numFiles": builtFiles,
- "log": logJson
- });
- });
- });
- }).catchError((error) {
- // If [getAllAssets()] throws a BarbackException, the error has already
- // been reported.
- if (error is! BarbackException) throw error;
-
- log.error(log.red("Build failed."));
- log.json.message({
- "buildResult": "failure",
- "errors": errorsJson,
- "log": logJson
- });
-
- return flushThenExit(exit_codes.DATA);
- });
- }
-
- /// Writes [asset] to the appropriate build directory.
- ///
- /// If [asset] is in the special "packages" directory, writes it to every
- /// build directory.
- Future _writeAsset(Asset asset) async {
- // In release mode, strip out .dart files since all relevant ones have been
- // compiled to JavaScript already.
- if (mode == BarbackMode.RELEASE && asset.id.extension == ".dart") {
- return null;
- }
-
- var destPath = _idToPath(asset.id);
-
- // If the asset is from a public directory, copy it into all of the
- // top-level build directories.
- if (path.isWithin("packages", destPath)) {
- return Future.wait(sourceDirectories.map((buildDir) =>
- _writeOutputFile(asset, path.join(buildDir, destPath))));
- }
-
- return _writeOutputFile(asset, destPath);
- }
-
- /// Converts [id] to a relative path in the output directory for that asset.
- ///
- /// This corresponds to the URL that could be used to request that asset from
- /// pub serve.
- ///
- /// Examples (where entrypoint is "myapp"):
- ///
- /// myapp|web/index.html -> web/index.html
- /// myapp|lib/lib.dart -> packages/myapp/lib.dart
- /// foo|lib/foo.dart -> packages/foo/foo.dart
- /// myapp|test/main.dart -> test/main.dart
- /// foo|test/main.dart -> ERROR
- ///
- /// Throws a [FormatException] if [id] is not a valid public asset.
- String _idToPath(AssetId id) {
- var parts = path.split(path.fromUri(id.path));
-
- if (parts.length < 2) {
- throw new FormatException(
- "Can not build assets from top-level directory.");
- }
-
- // Map "lib" to the "packages" directory.
- if (parts[0] == "lib") {
- return path.join("packages", id.package, path.joinAll(parts.skip(1)));
- }
-
- // Shouldn't be trying to access non-public directories of other packages.
- assert(id.package == entrypoint.root.name);
-
- // Allow any path in the entrypoint package.
- return path.joinAll(parts);
- }
-
- /// Writes the contents of [asset] to [relativePath] within the build
- /// directory.
- Future _writeOutputFile(Asset asset, String relativePath) {
- builtFiles++;
- var destPath = path.join(outputDirectory, relativePath);
- ensureDir(path.dirname(destPath));
- return createFileFromStream(asset.read(), destPath);
- }
-
- /// If this package depends directly on the `browser` package, this ensures
- /// that the JavaScript bootstrap files are copied into `packages/browser/`
- /// directories next to each entrypoint in [entrypoints].
- Future _copyBrowserJsFiles(Iterable<AssetId> entrypoints, AssetSet assets) {
- // Must depend on the browser package.
- if (!entrypoint.root.immediateDependencies.any(
- (dep) => dep.name == 'browser' && dep.source == 'hosted')) {
- return new Future.value();
- }
-
- // Get all of the subdirectories that contain Dart entrypoints.
- var entrypointDirs = entrypoints
- // Convert the asset path to a native-separated one and get the
- // directory containing the entrypoint.
- .map((id) => path.dirname(path.fromUri(id.path)))
- // Don't copy files to the top levels of the build directories since
- // the normal lib asset copying will take care of that.
- .where((dir) => path.split(dir).length > 1)
- .toSet();
-
- var jsAssets = assets.where((asset) =>
- asset.id.package == 'browser' && asset.id.extension == '.js');
- return Future.wait(entrypointDirs.expand((dir) {
- // TODO(nweiz): we should put browser JS files next to any HTML file
- // rather than any entrypoint. An HTML file could import an entrypoint
- // that's not adjacent.
- return jsAssets.map((asset) {
- var jsPath = path.join(dir, _idToPath(asset.id));
- return _writeOutputFile(asset, jsPath);
- });
- }));
- }
-
- /// Converts [entry] to a JSON object for use with JSON-formatted output.
- Map _logEntryToJson(LogEntry entry) {
- var data = {
- "level": entry.level.name,
- "transformer": {
- "name": entry.transform.transformer.toString(),
- "primaryInput": {
- "package": entry.transform.primaryId.package,
- "path": entry.transform.primaryId.path
- },
- },
- "assetId": {
- "package": entry.assetId.package,
- "path": entry.assetId.path
- },
- "message": entry.message
- };
-
- if (entry.span != null) {
- data["span"] = {
- "url": entry.span.sourceUrl,
- "start": {
- "line": entry.span.start.line,
- "column": entry.span.start.column
- },
- "end": {
- "line": entry.span.end.line,
- "column": entry.span.end.column
- },
- };
- }
-
- return data;
- }
-}
« no previous file with comments | « sdk/lib/_internal/pub/lib/src/command/barback.dart ('k') | sdk/lib/_internal/pub/lib/src/command/cache.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698