Skip to content

Commit cbf5e02

Browse files
committed
feat(build): add --verbose flag
Currently builds output a lot of information, some of which can hide errors, by default. This PR cuts down on the information shown and adds a `--verbose` flag to restore previous build output.
1 parent 86021a0 commit cbf5e02

File tree

8 files changed

+71
-42
lines changed

8 files changed

+71
-42
lines changed

packages/angular-cli/commands/build.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export interface BuildOptions {
1111
supressSizes: boolean;
1212
baseHref?: string;
1313
aot?: boolean;
14+
verbose?: boolean;
1415
}
1516

1617
const BuildCommand = Command.extend({
@@ -31,7 +32,8 @@ const BuildCommand = Command.extend({
3132
{ name: 'watcher', type: String },
3233
{ name: 'suppress-sizes', type: Boolean, default: false },
3334
{ name: 'base-href', type: String, default: null, aliases: ['bh'] },
34-
{ name: 'aot', type: Boolean, default: false }
35+
{ name: 'aot', type: Boolean, default: false },
36+
{ name: 'verbose', type: Boolean, default: false }
3537
],
3638

3739
run: function (commandOptions: BuildOptions) {

packages/angular-cli/commands/serve.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export interface ServeTaskOptions {
2626
sslKey?: string;
2727
sslCert?: string;
2828
aot?: boolean;
29+
verbose?: boolean;
2930
open?: boolean;
3031
}
3132

@@ -81,6 +82,7 @@ const ServeCommand = Command.extend({
8182
{ name: 'ssl-key', type: String, default: 'ssl/server.key' },
8283
{ name: 'ssl-cert', type: String, default: 'ssl/server.crt' },
8384
{ name: 'aot', type: Boolean, default: false },
85+
{ name: 'verbose', type: Boolean, default: false },
8486
{
8587
name: 'open',
8688
type: Boolean,

packages/angular-cli/models/webpack-build-production.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ declare module 'webpack' {
1313
}
1414
}
1515

16-
export const getWebpackProdConfigPartial = function(projectRoot: string, appConfig: any) {
16+
export const getWebpackProdConfigPartial = function(projectRoot: string,
17+
appConfig: any,
18+
verbose: any) {
1719
return {
1820
devtool: 'source-map',
1921
output: {
@@ -29,7 +31,7 @@ export const getWebpackProdConfigPartial = function(projectRoot: string, appConf
2931
}),
3032
new webpack.optimize.UglifyJsPlugin(<any>{
3133
mangle: { screw_ie8 : true },
32-
compress: { screw_ie8: true },
34+
compress: { screw_ie8: true, warnings: verbose },
3335
sourceMap: true
3436
}),
3537
new CompressionPlugin({

packages/angular-cli/models/webpack-build-utils.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,22 @@ export const ngAppResolve = (resolvePath: string): string => {
66

77
export const webpackOutputOptions = {
88
colors: true,
9+
hash: true,
10+
timings: true,
911
chunks: true,
12+
chunkModules: false,
13+
children: false, // listing all children is very noisy in AOT and hides warnings/errors
1014
modules: false,
1115
reasons: false,
12-
chunkModules: false
16+
warnings: true,
17+
assets: false, // listing all assets is very noisy when using assets directories
18+
version: false
1319
};
1420

15-
export const webpackDevServerOutputOptions = {
21+
export const verboseWebpackOutputOptions = {
22+
children: true,
1623
assets: true,
17-
colors: true,
1824
version: true,
19-
hash: true,
20-
timings: true,
21-
chunks: false,
22-
chunkModules: false
25+
reasons: true,
26+
chunkModules: false // TODO: set to true when console to file output is fixed
2327
};

packages/angular-cli/models/webpack-config.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ export class NgCliWebpackConfig {
2323
public environment: string,
2424
outputDir?: string,
2525
baseHref?: string,
26-
isAoT = false
26+
isAoT = false,
27+
verbose = false
2728
) {
2829
const config: CliConfig = CliConfig.fromProject();
2930
const appConfig = config.config.apps[0];
@@ -36,7 +37,7 @@ export class NgCliWebpackConfig {
3637
appConfig,
3738
baseHref
3839
);
39-
let targetConfigPartial = this.getTargetConfig(this.ngCliProject.root, appConfig);
40+
let targetConfigPartial = this.getTargetConfig(this.ngCliProject.root, appConfig, verbose);
4041
const typescriptConfigPartial = isAoT
4142
? getWebpackAotConfigPartial(this.ngCliProject.root, appConfig)
4243
: getWebpackNonAotConfigPartial(this.ngCliProject.root, appConfig);
@@ -58,12 +59,12 @@ export class NgCliWebpackConfig {
5859
);
5960
}
6061

61-
getTargetConfig(projectRoot: string, appConfig: any): any {
62+
getTargetConfig(projectRoot: string, appConfig: any, verbose: boolean): any {
6263
switch (this.target) {
6364
case 'development':
6465
return getWebpackDevConfigPartial(projectRoot, appConfig);
6566
case 'production':
66-
return getWebpackProdConfigPartial(projectRoot, appConfig);
67+
return getWebpackProdConfigPartial(projectRoot, appConfig, verbose);
6768
default:
6869
throw new Error("Invalid build target. Only 'development' and 'production' are available.");
6970
}

packages/angular-cli/tasks/build-webpack-watch.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ const Task = require('ember-cli/lib/models/task');
44
import * as webpack from 'webpack';
55
const ProgressPlugin = require('webpack/lib/ProgressPlugin');
66
import { NgCliWebpackConfig } from '../models/webpack-config';
7-
import { webpackOutputOptions } from '../models/';
7+
import { webpackOutputOptions, verboseWebpackOutputOptions } from '../models/';
88
import { BuildOptions } from '../commands/build';
99
import { CliConfig } from '../models/config';
1010

@@ -24,12 +24,18 @@ export default Task.extend({
2424
runTaskOptions.environment,
2525
outputDir,
2626
runTaskOptions.baseHref,
27-
runTaskOptions.aot
27+
runTaskOptions.aot,
28+
runTaskOptions.verbose
2829
).config;
2930
const webpackCompiler: any = webpack(config);
3031

32+
const statsOptions = runTaskOptions.verbose
33+
? Object.assign(webpackOutputOptions, verboseWebpackOutputOptions)
34+
: webpackOutputOptions;
35+
3136
webpackCompiler.apply(new ProgressPlugin({
32-
profile: true
37+
profile: runTaskOptions.verbose,
38+
colors: true
3339
}));
3440

3541
return new Promise((resolve, reject) => {
@@ -43,7 +49,7 @@ export default Task.extend({
4349

4450
if (stats.hash !== lastHash) {
4551
lastHash = stats.hash;
46-
process.stdout.write(stats.toString(webpackOutputOptions) + '\n');
52+
process.stdout.write(stats.toString(statsOptions) + '\n');
4753
}
4854
});
4955
});

packages/angular-cli/tasks/build-webpack.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import * as rimraf from 'rimraf';
22
import * as path from 'path';
3-
const Task = require('ember-cli/lib/models/task');
43
import * as webpack from 'webpack';
4+
const Task = require('ember-cli/lib/models/task');
5+
const ProgressPlugin = require('webpack/lib/ProgressPlugin');
56
import { BuildOptions } from '../commands/build';
67
import { NgCliWebpackConfig } from '../models/webpack-config';
7-
import { webpackOutputOptions } from '../models/';
8+
import { webpackOutputOptions, verboseWebpackOutputOptions } from '../models/';
89
import { CliConfig } from '../models/config';
910

1011
// Configure build and output;
@@ -23,18 +24,22 @@ export default <any>Task.extend({
2324
runTaskOptions.environment,
2425
outputDir,
2526
runTaskOptions.baseHref,
26-
runTaskOptions.aot
27+
runTaskOptions.aot,
28+
runTaskOptions.verbose
2729
).config;
2830

2931
// fail on build error
3032
config.bail = true;
3133

3234
const webpackCompiler: any = webpack(config);
3335

34-
const ProgressPlugin = require('webpack/lib/ProgressPlugin');
36+
const statsOptions = runTaskOptions.verbose
37+
? Object.assign(webpackOutputOptions, verboseWebpackOutputOptions)
38+
: webpackOutputOptions;
3539

3640
webpackCompiler.apply(new ProgressPlugin({
37-
profile: true
41+
profile: runTaskOptions.verbose,
42+
colors: true
3843
}));
3944

4045
return new Promise((resolve, reject) => {
@@ -51,7 +56,7 @@ export default <any>Task.extend({
5156

5257
if (stats.hash !== lastHash) {
5358
lastHash = stats.hash;
54-
process.stdout.write(stats.toString(webpackOutputOptions) + '\n');
59+
process.stdout.write(stats.toString(statsOptions) + '\n');
5560
}
5661
resolve();
5762
});

packages/angular-cli/tasks/serve-webpack.ts

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ const Task = require('ember-cli/lib/models/task');
66
import * as webpack from 'webpack';
77
const WebpackDevServer = require('webpack-dev-server');
88
const ProgressPlugin = require('webpack/lib/ProgressPlugin');
9-
import { webpackDevServerOutputOptions } from '../models/';
9+
import { webpackOutputOptions, verboseWebpackOutputOptions } from '../models/';
1010
import { NgCliWebpackConfig } from '../models/webpack-config';
1111
import { ServeTaskOptions } from '../commands/serve';
1212
import { CliConfig } from '../models/config';
@@ -15,35 +15,40 @@ import * as url from 'url';
1515
const opn = require('opn');
1616

1717
export default Task.extend({
18-
run: function(commandOptions: ServeTaskOptions) {
18+
run: function(serveTaskOptions: ServeTaskOptions) {
1919
const ui = this.ui;
2020

2121
let webpackCompiler: any;
2222

2323
let config = new NgCliWebpackConfig(
2424
this.project,
25-
commandOptions.target,
26-
commandOptions.environment,
25+
serveTaskOptions.target,
26+
serveTaskOptions.environment,
2727
undefined,
2828
undefined,
29-
commandOptions.aot
29+
serveTaskOptions.aot,
30+
serveTaskOptions.verbose
3031
).config;
3132

3233
// This allows for live reload of page when changes are made to repo.
3334
// https://webpack.github.io/docs/webpack-dev-server.html#inline-mode
3435
config.entry.main.unshift(
35-
`webpack-dev-server/client?http://${commandOptions.host}:${commandOptions.port}/`
36+
`webpack-dev-server/client?http://${serveTaskOptions.host}:${serveTaskOptions.port}/`
3637
);
3738
webpackCompiler = webpack(config);
3839

40+
const statsOptions = serveTaskOptions.verbose
41+
? Object.assign(webpackOutputOptions, verboseWebpackOutputOptions)
42+
: webpackOutputOptions;
43+
3944
webpackCompiler.apply(new ProgressPlugin({
40-
profile: true,
45+
profile: serveTaskOptions.verbose,
4146
colors: true
4247
}));
4348

4449
let proxyConfig = {};
45-
if (commandOptions.proxyConfig) {
46-
const proxyPath = path.resolve(this.project.root, commandOptions.proxyConfig);
50+
if (serveTaskOptions.proxyConfig) {
51+
const proxyPath = path.resolve(this.project.root, serveTaskOptions.proxyConfig);
4752
if (fs.existsSync(proxyPath)) {
4853
proxyConfig = require(proxyPath);
4954
} else {
@@ -54,12 +59,12 @@ export default Task.extend({
5459

5560
let sslKey: string = null;
5661
let sslCert: string = null;
57-
if (commandOptions.ssl) {
58-
const keyPath = path.resolve(this.project.root, commandOptions.sslKey);
62+
if (serveTaskOptions.ssl) {
63+
const keyPath = path.resolve(this.project.root, serveTaskOptions.sslKey);
5964
if (fs.existsSync(keyPath)) {
6065
sslKey = fs.readFileSync(keyPath, 'utf-8');
6166
}
62-
const certPath = path.resolve(this.project.root, commandOptions.sslCert);
67+
const certPath = path.resolve(this.project.root, serveTaskOptions.sslCert);
6368
if (fs.existsSync(certPath)) {
6469
sslCert = fs.readFileSync(certPath, 'utf-8');
6570
}
@@ -73,14 +78,14 @@ export default Task.extend({
7378
historyApiFallback: {
7479
disableDotRule: true,
7580
},
76-
stats: webpackDevServerOutputOptions,
81+
stats: statsOptions,
7782
inline: true,
7883
proxy: proxyConfig,
79-
compress: commandOptions.target === 'production',
84+
compress: serveTaskOptions.target === 'production',
8085
watchOptions: {
8186
poll: CliConfig.fromProject().config.defaults.poll
8287
},
83-
https: commandOptions.ssl
88+
https: serveTaskOptions.ssl
8489
};
8590

8691
if (sslKey != null && sslCert != null) {
@@ -91,19 +96,21 @@ export default Task.extend({
9196
ui.writeLine(chalk.green(oneLine`
9297
**
9398
NG Live Development Server is running on
94-
http${commandOptions.ssl ? 's' : ''}://${commandOptions.host}:${commandOptions.port}.
99+
http${serveTaskOptions.ssl ? 's' : ''}://${serveTaskOptions.host}:${serveTaskOptions.port}.
95100
**
96101
`));
97102

98103
const server = new WebpackDevServer(webpackCompiler, webpackDevServerConfiguration);
99104
return new Promise((resolve, reject) => {
100-
server.listen(commandOptions.port, `${commandOptions.host}`, function(err: any, stats: any) {
105+
server.listen(serveTaskOptions.port,
106+
`${serveTaskOptions.host}`,
107+
function(err: any, stats: any) {
101108
if (err) {
102109
console.error(err.stack || err);
103110
if (err.details) { console.error(err.details); }
104111
reject(err.details);
105112
} else {
106-
const { open, host, port } = commandOptions;
113+
const { open, host, port } = serveTaskOptions;
107114
if (open) {
108115
opn(url.format({ protocol: 'http', hostname: host, port: port.toString() }));
109116
}

0 commit comments

Comments
 (0)