Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Windows Build Tree still slow in 0.1.3 w/ symlinking #2680

Closed
elwayman02 opened this issue Dec 5, 2014 · 45 comments
Closed

Windows Build Tree still slow in 0.1.3 w/ symlinking #2680

elwayman02 opened this issue Dec 5, 2014 · 45 comments
Labels

Comments

@elwayman02
Copy link
Contributor

Opening issue at the request of @stefanpenner.

I recently following the instructions to allow symlinking in Windows (7 Pro) found here: http://www.ember-cli.com/#symlinks-on-windows. After updating my build, the build time went from around 230,000 ms to about 140,000 ms. Still a lot higher than expected, so posting this issue to see what we can do to track down a problem.

Snapshot of some of the relevant dependencies:

    "broccoli-asset-rev": "0.3.0",
    "broccoli-ember-hbs-template-compiler": "1.6.2",
    "broccoli-less-single": "git://github.com/jasonmit/broccoli-less-single.git",
    "broccoli-macro": "git+ssh://git@git.corp.yahoo.com:thoov/broccoli-macro.git",
    "broccoli-merge-trees": "0.1.4",
    "broccoli-static-compiler": "0.1.4",
    "connect-livereload": "0.3.0",
    "connect-restreamer": "1.0.0",
    "ember-cli": "0.1.3",
    "ember-cli-content-security-policy": "0.1.1",
    "ember-cli-document-title": "0.0.1",
    "ember-cli-ember-data": "0.2.0",
    "ember-cli-ic-ajax": "0.1.1",
    "ember-cli-inject-live-reload": "1.2.2",
    "ember-cli-qunit": "0.1.0",
    "ember-cpm": "1.3.0",
    "ember-deprecated": "0.0.1",
    "ember-devtools": "2.0.0",

I've included the build output of a

Initial Build:

Build successful - 145489ms.

Slowest Trees                  | Total          
-------------------------------+----------------
TreeMerger (appAndDependencies) | 31643ms        
JSHint - App                   | 25746ms        
TreeMerger (stylesAndVendor)   | 19331ms        
ES6Concatenator                | 15333ms        
LessCompiler                   | 12582ms   

Change Build 1:

Build successful - 181094ms.

Slowest Trees                  | Total          
-------------------------------+----------------
TreeMerger (appAndDependencies) | 46993ms        
TreeMerger (stylesAndVendor)   | 29225ms        
TreeMerger (ExternalTree)      | 18960ms        
CustomStaticCompiler           | 14766ms    

Change Build 2:

Build successful - 133385ms.

Slowest Trees                  | Total          
-------------------------------+----------------
TreeMerger (appAndDependencies) | 43403ms        
TreeMerger (stylesAndVendor)   | 26387ms        
CustomStaticCompiler           | 8509ms         
JSHint - App                   | 8197ms         
TreeMerger (ExternalTree)      | 7431ms 
@stefanpenner
Copy link
Contributor

do you have an SSD or an HDD.
what sort of machine

It is true I have only tested on windows 8, maybe something is funky in windows 7.

Something that would help greatly is a dummy app with many dummy files that causes the same problem for you, that we debug it easily.

@mike-north
Copy link
Member

OS X version

Initial build

Build successful - 30947ms.

Slowest Trees                  | Total          
-------------------------------+----------------
JSHint - App                   | 10477ms        
ES6Concatenator                | 7104ms         
LessCompiler                   | 5914ms         
JSHint - Tests                 | 4546ms         

Incremental Build:

Build successful - 3765ms.

Slowest Trees                  | Total          
-------------------------------+----------------
JSHint - App                   | 613ms          
ES6Concatenator                | 596ms          
Funnel                         | 549ms          
Funnel                         | 416ms          
LessCompiler                   | 234ms          
TemplateCompiler               | 213ms          
TreeMerger (vendor)            | 213ms      

@elwayman02
Copy link
Contributor Author

i7 64-bit laptop with SSD

@stefanpenner
Copy link
Contributor

@truenorth can you also share the #'s of various files.

@stefanpenner
Copy link
Contributor

i7 64-bit laptop with SSD

ya that's bonkers then... Would love to get my hands on this app to see what we can figure out.

@mike-north
Copy link
Member

Here's what our /app folder looks like

Type Count
JavaScript 1163 Files
LESS 79 Files
HBS 385 Files

@elwayman02
Copy link
Contributor Author

I'll also note that my local brocfile skips a couple steps that run on the Mac machines...I have minifyJS and wrapInEval set to false (because I can't debug the app locally with those set to true), and we have a macro-substituted tree that I don't build (because it doesn't work in windows). So in reality, my build would take even longer if I was using the exact same settings as the rest of the team.

@stefanpenner stefanpenner added this to the v1.0.0 milestone Dec 5, 2014
@stefanpenner
Copy link
Contributor

also, what is broccoli-macro ?

@rwjblue
Copy link
Member

rwjblue commented Dec 5, 2014

Biggest time is merging bower_components/vendor. What is the size (by count and filesize). Do you have any significant extraneous files in there?=

@stefanpenner
Copy link
Contributor

man i wish broccolijs/broccoli#219 was in release broccoli, we could pretty easily see what is being slow...

@mike-north
Copy link
Member

@stefanpenner broccoli-macro performs substitutions

var macroSub = require('broccoli-macro');

var concatenated = macroSub(sourceTree, {
  macros: [{
    name: '<!-- @something-random -->',
    value: 'the value which will be substituted in'
  }],
  glob: ['**/*.js','**/*.html', '**/*.json'],
  verbose: true
});

We use this to have some per-deployment configuration variables (i.e., which API endpoint to hit).

@rwjblue, here's our vendor folder

Type Count
JavaScript 1207
CSS 156

I'll update my post with file sizes

@stefanpenner
Copy link
Contributor

@truenorth is the source public, i would like to review it.

@stefanpenner
Copy link
Contributor

@truenorth so just confirming you guys actually have 2370 JS files.

@elwayman02
Copy link
Contributor Author

That sounds about right, @stefanpenner

@rwjblue
Copy link
Member

rwjblue commented Dec 5, 2014

@elwayman02 - Can you remove unused files from bower_components? For example, only leave files that are explicitly added via app.import (both the internal ones that we do like bower_components/ember/ember.js and the ones from addons and your own app.import).

@elwayman02
Copy link
Contributor Author

@rwjblue that's going to take a while to sort through...we have about 45 bower dependencies 🎉

Will try to check it out, though.

@rwjblue
Copy link
Member

rwjblue commented Dec 5, 2014

@elwayman02 - Sorry to be a pain. Our merging algorithm is fairly good (we symlink as high up the chain as possible), but unused files have in the past exacerbated many perf issues.

It is also possible that somewhere in the dep tree you are not getting the new Windows symlink aware symlink-or-copy package. Can you share your node --version and npm --version? Different versions of NPM handle this inter package dependency situation differently...

@elwayman02
Copy link
Contributor Author

Node v0.10.28
NPM 1.4.9

@stefanpenner
Copy link
Contributor

NPM 1.4.9

unrelated, but let my strongly advice you upgrade to the latest 2x of npm. Many bug fixes.

@stefanpenner
Copy link
Contributor

@rwjblue for reference asking for npm version will give you everything you need.

± % npm version                                                                               !10055
{ http_parser: '2.3',
  node: '0.11.14',
  v8: '3.26.33',
  uv: '1.0.0',
  zlib: '1.2.3',
  modules: '14',
  openssl: '1.0.1i',
  npm: '2.1.7',
  'ember-cli': '0.1.4' }

@stefanpenner
Copy link
Contributor

@rwjblue that's going to take a while to sort through...we have about 45 bower dependencies

honestly, just remove them entirely and see how it affects the build. Even if this breaks your app it will hint to the magnitude of perf slowness vendor or bower_components is introducing.

@elwayman02
Copy link
Contributor Author

screenshot_120514_042354_pm

@rwjblue
Copy link
Member

rwjblue commented Dec 6, 2014

NPM 1.4.9

unrelated, but let my strongly advice you upgrade to the latest 2x of npm. Many bug fixes.

@stefanpenner - I believe it to be a potential factor here. NPM 1.x does not promote deps to the latest version the same way as NPM 2.x. This means that the incorrect (aka old) version of symlink-or-copy may not be being used.

@stefanpenner
Copy link
Contributor

NPM 1.x does not promote deps to the latest version the same way as NPM 2.x.

good point.

We should likely consider explicitly exploding if people try to start the app with an old NPM

@stefanpenner
Copy link
Contributor

@elwayman02 running npm ls in the project may let us see if some thing looks strange. Although it will be massive, so I am not looking forward to reading it:P

@raytiley
Copy link
Member

raytiley commented Dec 6, 2014

I have npm version 1.4.28 on a cli 0.1.2 app.

If I clear my node_modules and run npm install I get symlink-or-copy 1.0.1 which has the windows symlinking. You might have to remove node_modules since most things are depending on ^1.0.0 which might not update to 1.0.1 if you don't clear the node_modules folder.

cablecast-ui@0.0.0 D:\code\cablecast\Web\cablecast-ui
├─┬ body-parser@1.10.0
│ ├── bytes@1.0.0
│ ├── depd@1.0.0
│ ├── iconv-lite@0.4.5
│ ├── media-typer@0.3.0
│ ├─┬ on-finished@2.1.1
│ │ └── ee-first@1.1.0
│ ├── qs@2.3.3
│ ├── raw-body@1.3.1
│ └─┬ type-is@1.5.3
│   └─┬ mime-types@2.0.3
│     └── mime-db@1.2.0
├─┬ broccoli-asset-rev@0.3.1
│ ├── broccoli-asset-rewrite@0.1.0
│ ├─┬ broccoli-filter@0.1.10
│ │ ├── broccoli-kitchen-sink-helpers@0.2.5
│ │ ├── broccoli-writer@0.1.1
│ │ ├── mkdirp@0.3.5
│ │ ├── promise-map-series@0.2.0
│ │ ├─┬ quick-temp@0.1.2
│ │ │ ├── mktemp@0.3.5
│ │ │ ├── rimraf@2.2.8
│ │ │ └── underscore.string@2.3.3
│ │ └── walk-sync@0.1.3
│ └── rsvp@3.0.14
├─┬ broccoli-ember-hbs-template-compiler@1.7.0
│ ├─┬ broccoli-filter@0.1.10
│ │ ├── broccoli-kitchen-sink-helpers@0.2.5
│ │ ├── broccoli-writer@0.1.1
│ │ ├── mkdirp@0.3.5
│ │ ├── promise-map-series@0.2.0
│ │ ├─┬ quick-temp@0.1.2
│ │ │ ├── mktemp@0.3.5
│ │ │ ├── rimraf@2.2.8
│ │ │ └── underscore.string@2.3.3
│ │ ├── rsvp@3.0.14
│ │ └── walk-sync@0.1.3
│ ├── ember-template-compiler@1.7.0
│ ├─┬ handlebars@1.3.0
│ │ ├─┬ optimist@0.3.7
│ │ │ └── wordwrap@0.0.2
│ │ └─┬ uglify-js@2.3.6
│ │   ├── async@0.2.10
│ │   └─┬ source-map@0.1.40
│ │     └── amdefine@0.1.0
│ └── js-string-escape@1.0.0
├─┬ broccoli-file-mover@0.4.2
│ ├─┬ broccoli-writer@0.1.1
│ │ ├─┬ quick-temp@0.1.2
│ │ │ ├── mktemp@0.3.5
│ │ │ └── underscore.string@2.3.3
│ │ └── rsvp@3.0.14
│ ├─┬ chalk@0.5.1
│ │ ├── ansi-styles@1.1.0
│ │ ├── escape-string-regexp@1.0.2
│ │ ├─┬ has-ansi@0.1.0
│ │ │ └── ansi-regex@0.2.1
│ │ ├─┬ strip-ansi@0.3.0
│ │ │ └── ansi-regex@0.2.1
│ │ └── supports-color@0.2.0
│ ├─┬ mkdirp@0.5.0
│ │ └── minimist@0.0.8
│ ├── rimraf@2.2.8
│ └─┬ symlink-or-copy@1.0.1
│   └── copy-dereference@1.0.0
├─┬ broccoli-merge-trees@0.2.1
│ ├─┬ broccoli-writer@0.1.1
│ │ ├─┬ quick-temp@0.1.2
│ │ │ ├── mktemp@0.3.5
│ │ │ ├── rimraf@2.2.8
│ │ │ └── underscore.string@2.3.3
│ │ └── rsvp@3.0.14
│ ├─┬ promise-map-series@0.2.0
│ │ └── rsvp@3.0.14
│ └─┬ symlink-or-copy@1.0.1
│   └── copy-dereference@1.0.0
├─┬ broccoli-static-compiler@0.2.1
│ ├─┬ broccoli-kitchen-sink-helpers@0.2.5
│ │ └── mkdirp@0.3.5
│ ├─┬ broccoli-writer@0.1.1
│ │ ├─┬ quick-temp@0.1.2
│ │ │ ├── mktemp@0.3.5
│ │ │ ├── rimraf@2.2.8
│ │ │ └── underscore.string@2.3.3
│ │ └── rsvp@3.0.14
│ ├─┬ mkdirp@0.5.0
│ │ └── minimist@0.0.8
│ └─┬ symlink-or-copy@1.0.1
│   └── copy-dereference@1.0.0
├─┬ ember-cli@0.1.2
│ ├── abbrev@1.0.5
│ ├─┬ bower@1.3.12
│ │ ├── archy@0.0.2
│ │ ├── bower-endpoint-parser@0.2.2
│ │ ├─┬ bower-json@0.4.0
│ │ │ ├── deep-extend@0.2.11
│ │ │ ├── graceful-fs@2.0.3
│ │ │ └── intersect@0.0.3
│ │ ├── bower-logger@0.2.2
│ │ ├─┬ bower-registry-client@0.2.1
│ │ │ ├── async@0.2.10
│ │ │ ├── graceful-fs@2.0.3
│ │ │ ├── lru-cache@2.3.1
│ │ │ ├── mkdirp@0.3.5
│ │ │ ├─┬ request@2.27.0
│ │ │ │ ├── aws-sign@0.3.0
│ │ │ │ ├── cookie-jar@0.3.0
│ │ │ │ ├── forever-agent@0.5.2
│ │ │ │ ├─┬ form-data@0.1.4
│ │ │ │ │ ├── async@0.9.0
│ │ │ │ │ └─┬ combined-stream@0.0.5
│ │ │ │ │   └── delayed-stream@0.0.5
│ │ │ │ ├─┬ hawk@1.0.0
│ │ │ │ │ ├── boom@0.4.2
│ │ │ │ │ ├── cryptiles@0.2.2
│ │ │ │ │ ├── hoek@0.9.1
│ │ │ │ │ └── sntp@0.2.4
│ │ │ │ ├─┬ http-signature@0.10.0
│ │ │ │ │ ├── asn1@0.1.11
│ │ │ │ │ ├── assert-plus@0.1.2
│ │ │ │ │ └── ctype@0.5.2
│ │ │ │ ├── json-stringify-safe@5.0.0
│ │ │ │ ├── mime@1.2.11
│ │ │ │ ├── node-uuid@1.4.1
│ │ │ │ ├── oauth-sign@0.3.0
│ │ │ │ ├── qs@0.6.6
│ │ │ │ └── tunnel-agent@0.3.0
│ │ │ └── request-replay@0.2.0
│ │ ├─┬ cardinal@0.4.0
│ │ │ └─┬ redeyed@0.4.4
│ │ │   └── esprima@1.0.4
│ │ ├─┬ chalk@0.5.0
│ │ │ ├── ansi-styles@1.1.0
│ │ │ ├── escape-string-regexp@1.0.2
│ │ │ ├─┬ has-ansi@0.1.0
│ │ │ │ └── ansi-regex@0.2.0
│ │ │ ├─┬ strip-ansi@0.3.0
│ │ │ │ └── ansi-regex@0.2.1
│ │ │ └── supports-color@0.2.0
│ │ ├── chmodr@0.1.0
│ │ ├─┬ decompress-zip@0.0.8
│ │ │ ├─┬ binary@0.3.0
│ │ │ │ ├── buffers@0.1.1
│ │ │ │ └─┬ chainsaw@0.1.0
│ │ │ │   └── traverse@0.3.9
│ │ │ ├── mkpath@0.1.0
│ │ │ ├── nopt@2.2.1
│ │ │ ├─┬ readable-stream@1.1.13
│ │ │ │ ├── core-util-is@1.0.1
│ │ │ │ ├── inherits@2.0.1
│ │ │ │ ├── isarray@0.0.1
│ │ │ │ └── string_decoder@0.10.31
│ │ │ └─┬ touch@0.0.2
│ │ │   └── nopt@1.0.10
│ │ ├─┬ fstream@1.0.2
│ │ │ └── inherits@2.0.1
│ │ ├─┬ fstream-ignore@1.0.1
│ │ │ └── inherits@2.0.1
│ │ ├── graceful-fs@3.0.4
│ │ ├─┬ handlebars@2.0.0
│ │ │ ├─┬ optimist@0.3.7
│ │ │ │ └── wordwrap@0.0.2
│ │ │ └─┬ uglify-js@2.3.6
│ │ │   ├── async@0.2.10
│ │ │   └─┬ source-map@0.1.40
│ │ │     └── amdefine@0.1.0
│ │ ├─┬ inquirer@0.7.1
│ │ │ ├─┬ cli-color@0.3.2
│ │ │ │ ├── d@0.1.1
│ │ │ │ ├─┬ es5-ext@0.10.4
│ │ │ │ │ ├── es6-iterator@0.1.1
│ │ │ │ │ └── es6-symbol@0.1.1
│ │ │ │ ├─┬ memoizee@0.3.8
│ │ │ │ │ ├─┬ es6-weak-map@0.1.2
│ │ │ │ │ │ ├── es6-iterator@0.1.1
│ │ │ │ │ │ └── es6-symbol@0.1.1
│ │ │ │ │ ├── event-emitter@0.3.1
│ │ │ │ │ ├── lru-queue@0.1.0
│ │ │ │ │ └── next-tick@0.2.2
│ │ │ │ └─┬ timers-ext@0.1.0
│ │ │ │   └── next-tick@0.2.2
│ │ │ ├── figures@1.3.3
│ │ │ ├── lodash@2.4.1
│ │ │ ├── mute-stream@0.0.4
│ │ │ └── rx@2.3.13
│ │ ├─┬ insight@0.4.3
│ │ │ ├── async@0.9.0
│ │ │ ├─┬ chalk@0.5.1
│ │ │ │ ├── ansi-styles@1.1.0
│ │ │ │ ├── escape-string-regexp@1.0.2
│ │ │ │ ├─┬ has-ansi@0.1.0
│ │ │ │ │ └── ansi-regex@0.2.0
│ │ │ │ ├─┬ strip-ansi@0.3.0
│ │ │ │ │ └── ansi-regex@0.2.1
│ │ │ │ └── supports-color@0.2.0
│ │ │ ├─┬ inquirer@0.6.0
│ │ │ │ ├─┬ chalk@0.5.0
│ │ │ │ │ ├── ansi-styles@1.1.0
│ │ │ │ │ ├── escape-string-regexp@1.0.2
│ │ │ │ │ ├─┬ has-ansi@0.1.0
│ │ │ │ │ │ └── ansi-regex@0.2.0
│ │ │ │ │ ├─┬ strip-ansi@0.3.0
│ │ │ │ │ │ └── ansi-regex@0.2.1
│ │ │ │ │ └── supports-color@0.2.0
│ │ │ │ ├─┬ cli-color@0.3.2
│ │ │ │ │ ├── d@0.1.1
│ │ │ │ │ ├─┬ es5-ext@0.10.4
│ │ │ │ │ │ ├── es6-iterator@0.1.1
│ │ │ │ │ │ └── es6-symbol@0.1.1
│ │ │ │ │ ├─┬ memoizee@0.3.8
│ │ │ │ │ │ ├─┬ es6-weak-map@0.1.2
│ │ │ │ │ │ │ ├── es6-iterator@0.1.1
│ │ │ │ │ │ │ └── es6-symbol@0.1.1
│ │ │ │ │ │ ├── event-emitter@0.3.1
│ │ │ │ │ │ ├── lru-queue@0.1.0
│ │ │ │ │ │ └── next-tick@0.2.2
│ │ │ │ │ └─┬ timers-ext@0.1.0
│ │ │ │ │   └── next-tick@0.2.2
│ │ │ │ ├── lodash@2.4.1
│ │ │ │ ├── mute-stream@0.0.4
│ │ │ │ └── rx@2.3.13
│ │ │ ├─┬ lodash.debounce@2.4.1
│ │ │ │ ├── lodash.isfunction@2.4.1
│ │ │ │ ├─┬ lodash.isobject@2.4.1
│ │ │ │ │ └── lodash._objecttypes@2.4.1
│ │ │ │ └─┬ lodash.now@2.4.1
│ │ │ │   └── lodash._isnative@2.4.1
│ │ │ ├── object-assign@1.0.0
│ │ │ ├─┬ os-name@1.0.1
│ │ │ │ ├── minimist@1.1.0
│ │ │ │ └── osx-release@1.0.0
│ │ │ └─┬ tough-cookie@0.12.1
│ │ │   └── punycode@1.3.1
│ │ ├── is-root@1.0.0
│ │ ├── junk@1.0.0
│ │ ├── lockfile@1.0.0
│ │ ├── lru-cache@2.5.0
│ │ ├── mout@0.9.1
│ │ ├── opn@1.0.0
│ │ ├── osenv@0.1.0
│ │ ├─┬ p-throttler@0.1.0
│ │ │ └── q@0.9.7
│ │ ├─┬ promptly@0.2.0
│ │ │ └─┬ read@1.0.5
│ │ │   └── mute-stream@0.0.4
│ │ ├── q@1.0.1
│ │ ├─┬ request@2.42.0
│ │ │ ├── aws-sign2@0.5.0
│ │ │ ├─┬ bl@0.9.3
│ │ │ │ └─┬ readable-stream@1.0.33-1
│ │ │ │   ├── core-util-is@1.0.1
│ │ │ │   ├── inherits@2.0.1
│ │ │ │   ├── isarray@0.0.1
│ │ │ │   └── string_decoder@0.10.31
│ │ │ ├── caseless@0.6.0
│ │ │ ├── forever-agent@0.5.2
│ │ │ ├─┬ form-data@0.1.4
│ │ │ │ ├── async@0.9.0
│ │ │ │ ├─┬ combined-stream@0.0.5
│ │ │ │ │ └── delayed-stream@0.0.5
│ │ │ │ └── mime@1.2.11
│ │ │ ├─┬ hawk@1.1.1
│ │ │ │ ├── boom@0.4.2
│ │ │ │ ├── cryptiles@0.2.2
│ │ │ │ ├── hoek@0.9.1
│ │ │ │ └── sntp@0.2.4
│ │ │ ├─┬ http-signature@0.10.0
│ │ │ │ ├── asn1@0.1.11
│ │ │ │ ├── assert-plus@0.1.2
│ │ │ │ └── ctype@0.5.2
│ │ │ ├── json-stringify-safe@5.0.0
│ │ │ ├── mime-types@1.0.2
│ │ │ ├── node-uuid@1.4.1
│ │ │ ├── oauth-sign@0.4.0
│ │ │ ├── qs@1.2.2
│ │ │ ├── stringstream@0.0.4
│ │ │ ├─┬ tough-cookie@0.12.1
│ │ │ │ └── punycode@1.3.1
│ │ │ └── tunnel-agent@0.4.0
│ │ ├─┬ request-progress@0.3.0
│ │ │ └── throttleit@0.0.2
│ │ ├── retry@0.6.0
│ │ ├── semver@2.3.2
│ │ ├─┬ shell-quote@1.4.2
│ │ │ ├── array-filter@0.0.1
│ │ │ ├── array-map@0.0.0
│ │ │ ├── array-reduce@0.0.0
│ │ │ └── jsonify@0.0.0
│ │ ├── stringify-object@1.0.0
│ │ ├─┬ tar-fs@0.5.2
│ │ │ ├─┬ pump@0.3.5
│ │ │ │ ├─┬ end-of-stream@1.0.0
│ │ │ │ │ └─┬ once@1.3.1
│ │ │ │ │   └── wrappy@1.0.1
│ │ │ │ └── once@1.2.0
│ │ │ └─┬ tar-stream@0.4.6
│ │ │   ├─┬ bl@0.9.0
│ │ │   │ └─┬ readable-stream@1.0.26-4
│ │ │   │   ├── core-util-is@1.0.1
│ │ │   │   ├── inherits@2.0.1
│ │ │   │   ├── isarray@0.0.1
│ │ │   │   └── string_decoder@0.10.25-1
│ │ │   ├─┬ end-of-stream@1.1.0
│ │ │   │ └─┬ once@1.3.1
│ │ │   │   └── wrappy@1.0.1
│ │ │   ├─┬ readable-stream@1.0.33-1
│ │ │   │ ├── core-util-is@1.0.1
│ │ │   │ ├── inherits@2.0.1
│ │ │   │ ├── isarray@0.0.1
│ │ │   │ └── string_decoder@0.10.31
│ │ │   └── xtend@4.0.0
│ │ ├── tmp@0.0.23
│ │ ├─┬ update-notifier@0.2.0
│ │ │ ├─┬ configstore@0.3.0
│ │ │ │ ├── graceful-fs@2.0.3
│ │ │ │ ├─┬ js-yaml@3.0.2
│ │ │ │ │ ├─┬ argparse@0.1.15
│ │ │ │ │ │ ├── underscore@1.4.4
│ │ │ │ │ │ └── underscore.string@2.3.3
│ │ │ │ │ └── esprima@1.0.4
│ │ │ │ ├── mkdirp@0.3.5
│ │ │ │ ├── object-assign@0.2.2
│ │ │ │ ├── osenv@0.0.3
│ │ │ │ └── uuid@1.4.2
│ │ │ ├─┬ latest-version@0.2.0
│ │ │ │ └─┬ package-json@0.2.0
│ │ │ │   ├─┬ got@0.3.0
│ │ │ │   │ └── object-assign@0.3.0
│ │ │ │   └─┬ registry-url@0.1.0
│ │ │ │     └─┬ npmconf@1.1.9
│ │ │ │       ├─┬ config-chain@1.1.8
│ │ │ │       │ └── proto-list@1.2.3
│ │ │ │       ├── inherits@2.0.1
│ │ │ │       ├── ini@1.3.0
│ │ │ │       ├─┬ once@1.3.1
│ │ │ │       │ └── wrappy@1.0.1
│ │ │ │       └── uid-number@0.0.5
│ │ │ ├── semver-diff@0.1.0
│ │ │ └─┬ string-length@0.1.2
│ │ │   └── strip-ansi@0.2.1
│ │ └── which@1.0.5
│ ├─┬ bower-config@0.5.2
│ │ ├── graceful-fs@2.0.3
│ │ ├── mout@0.9.1
│ │ ├─┬ optimist@0.6.1
│ │ │ ├── minimist@0.0.10
│ │ │ └── wordwrap@0.0.2
│ │ └── osenv@0.0.3
│ ├─┬ broccoli@0.13.1
│ │ ├─┬ broccoli-kitchen-sink-helpers@0.2.0
│ │ │ ├─┬ glob@3.2.11
│ │ │ │ ├── inherits@2.0.1
│ │ │ │ └─┬ minimatch@0.3.0
│ │ │ │   ├── lru-cache@2.5.0
│ │ │ │   └── sigmund@1.0.0
│ │ │ └── mkdirp@0.3.5
│ │ ├── commander@2.3.0
│ │ ├─┬ connect@3.2.0
│ │ │ ├─┬ debug@2.0.0
│ │ │ │ └── ms@0.6.2
│ │ │ ├─┬ finalhandler@0.2.0
│ │ │ │ └── escape-html@1.0.1
│ │ │ ├── parseurl@1.3.0
│ │ │ └── utils-merge@1.0.0
│ │ ├── copy-dereference@1.0.0
│ │ ├─┬ findup-sync@0.1.2
│ │ │ ├─┬ glob@3.1.21
│ │ │ │ ├── graceful-fs@1.2.3
│ │ │ │ ├── inherits@1.0.0
│ │ │ │ └─┬ minimatch@0.2.14
│ │ │ │   ├── lru-cache@2.5.0
│ │ │ │   └── sigmund@1.0.0
│ │ │ └── lodash@1.0.1
│ │ ├─┬ handlebars@2.0.0
│ │ │ ├─┬ optimist@0.3.7
│ │ │ │ └── wordwrap@0.0.2
│ │ │ └─┬ uglify-js@2.3.6
│ │ │   ├── async@0.2.10
│ │ │   └─┬ source-map@0.1.40
│ │ │     └── amdefine@0.1.0
│ │ └── mime@1.2.11
│ ├─┬ broccoli-caching-writer@0.5.1
│ │ ├─┬ broccoli-kitchen-sink-helpers@0.2.5
│ │ │ └── mkdirp@0.3.5
│ │ ├─┬ core-object@0.0.2
│ │ │ └── lodash-node@2.4.1
│ │ ├── promise-map-series@0.2.0
│ │ ├─┬ quick-temp@0.1.2
│ │ │ ├── mktemp@0.3.5
│ │ │ └── underscore.string@2.3.3
│ │ ├── rimraf@2.2.8
│ │ └── rsvp@3.0.14
│ ├─┬ broccoli-clean-css@0.2.0
│ │ ├─┬ broccoli-filter@0.1.6
│ │ │ ├─┬ broccoli-kitchen-sink-helpers@0.2.0
│ │ │ │ └─┬ glob@3.2.11
│ │ │ │   ├── inherits@2.0.1
│ │ │ │   └─┬ minimatch@0.3.0
│ │ │ │     ├── lru-cache@2.5.0
│ │ │ │     └── sigmund@1.0.0
│ │ │ ├── mkdirp@0.3.5
│ │ │ ├── promise-map-series@0.2.0
│ │ │ ├─┬ quick-temp@0.1.0
│ │ │ │ ├── mktemp@0.3.5
│ │ │ │ └── underscore.string@2.3.3
│ │ │ └── walk-sync@0.1.0
│ │ └─┬ clean-css@2.2.16
│ │   └── commander@2.2.0
│ ├─┬ broccoli-concat@0.0.12
│ │ └─┬ broccoli-kitchen-sink-helpers@0.2.4
│ │   ├─┬ glob@3.2.11
│ │   │ ├── inherits@2.0.1
│ │   │ └─┬ minimatch@0.3.0
│ │   │   ├── lru-cache@2.5.0
│ │   │   └── sigmund@1.0.0
│ │   └── mkdirp@0.3.5
│ ├─┬ broccoli-es3-safe-recast@1.0.0
│ │ └─┬ es3-safe-recast@1.0.0
│ │   ├── es-simpler-traverser@0.0.1
│ │   ├── esprima@1.1.0-dev-harmony (git+https://github.com/thomasboyt/esprima#4be906f1abcbb6822e33526b4bab725c6095afcd)
│ │   └─┬ recast@0.5.27
│ │     ├── ast-types@0.3.38
│ │     ├── cls@0.1.5
│ │     ├── esprima@1.1.0-dev-harmony (git+https://github.com/ariya/esprima.git#55f7eba7d245df18ab8e3672af08cd1b94c38944)
│ │     ├── private@0.1.5
│ │     └─┬ source-map@0.1.32
│ │       └── amdefine@0.1.0
│ ├─┬ broccoli-es6-concatenator@0.1.10
│ │ ├─┬ es6-module-transpiler@0.3.6
│ │ │ └─┬ optimist@0.3.7
│ │ │   └── wordwrap@0.0.2
│ │ └── mkdirp@0.3.5
│ ├─┬ broccoli-filter@0.1.7
│ │ ├── mkdirp@0.3.5
│ │ ├── promise-map-series@0.2.0
│ │ ├─┬ quick-temp@0.1.0
│ │ │ ├── mktemp@0.3.5
│ │ │ └── underscore.string@2.3.3
│ │ └── walk-sync@0.1.0
│ ├── broccoli-funnel@0.1.5
│ ├─┬ broccoli-jshint@0.5.3
│ │ ├─┬ chalk@0.4.0
│ │ │ ├── ansi-styles@1.0.0
│ │ │ ├── has-color@0.1.7
│ │ │ └── strip-ansi@0.1.1
│ │ ├─┬ findup-sync@0.1.3
│ │ │ ├─┬ glob@3.2.11
│ │ │ │ ├── inherits@2.0.1
│ │ │ │ └─┬ minimatch@0.3.0
│ │ │ │   ├── lru-cache@2.5.0
│ │ │ │   └── sigmund@1.0.0
│ │ │ └── lodash@2.4.1
│ │ ├─┬ jshint@2.5.6
│ │ │ ├─┬ cli@0.6.4
│ │ │ │ └─┬ glob@3.2.11
│ │ │ │   ├── inherits@2.0.1
│ │ │ │   └─┬ minimatch@0.3.0
│ │ │ │     ├── lru-cache@2.5.0
│ │ │ │     └── sigmund@1.0.0
│ │ │ ├─┬ console-browserify@1.1.0
│ │ │ │ └── date-now@0.1.4
│ │ │ ├── exit@0.1.2
│ │ │ ├─┬ htmlparser2@3.7.3
│ │ │ │ ├── domelementtype@1.1.1
│ │ │ │ ├── domhandler@2.2.0
│ │ │ │ ├── domutils@1.5.0
│ │ │ │ ├── entities@1.0.0
│ │ │ │ └─┬ readable-stream@1.1.13
│ │ │ │   ├── core-util-is@1.0.1
│ │ │ │   ├── inherits@2.0.1
│ │ │ │   ├── isarray@0.0.1
│ │ │ │   └── string_decoder@0.10.31
│ │ │ ├── shelljs@0.3.0
│ │ │ ├── strip-json-comments@1.0.1
│ │ │ └── underscore@1.6.0
│ │ └─┬ mkdirp@0.4.2
│ │   └── minimist@0.0.8
│ ├─┬ broccoli-kitchen-sink-helpers@0.2.5
│ │ └── mkdirp@0.3.5
│ ├─┬ broccoli-merge-trees@0.2.1
│ │ └── promise-map-series@0.2.0
│ ├─┬ broccoli-sane-watcher@0.0.7
│ │ ├── broccoli-slow-trees@1.0.0
│ │ └─┬ sane@0.7.1
│ │   ├─┬ minimatch@0.2.14
│ │   │ ├── lru-cache@2.5.0
│ │   │ └── sigmund@1.0.0
│ │   ├─┬ walker@1.0.6
│ │   │ └─┬ makeerror@1.0.8
│ │   │   └── tmpl@1.0.1
│ │   └── watch@0.10.0
│ ├── broccoli-static-compiler@0.2.1
│ ├─┬ broccoli-uglify-js@0.1.3
│ │ ├─┬ broccoli-filter@0.1.6
│ │ │ ├─┬ broccoli-kitchen-sink-helpers@0.2.0
│ │ │ │ └─┬ glob@3.2.11
│ │ │ │   ├── inherits@2.0.1
│ │ │ │   └─┬ minimatch@0.3.0
│ │ │ │     ├── lru-cache@2.5.0
│ │ │ │     └── sigmund@1.0.0
│ │ │ ├── mkdirp@0.3.5
│ │ │ ├── promise-map-series@0.2.0
│ │ │ ├─┬ quick-temp@0.1.0
│ │ │ │ ├── mktemp@0.3.5
│ │ │ │ └── underscore.string@2.3.3
│ │ │ └── walk-sync@0.1.0
│ │ └─┬ uglify-js@2.4.15
│ │   ├── async@0.2.10
│ │   ├─┬ optimist@0.3.7
│ │   │ └── wordwrap@0.0.2
│ │   ├─┬ source-map@0.1.34
│ │   │ └── amdefine@0.1.0
│ │   └── uglify-to-browserify@1.0.2
│ ├── broccoli-unwatched-tree@0.1.1
│ ├─┬ broccoli-writer@0.1.1
│ │ ├─┬ quick-temp@0.1.2
│ │ │ ├── mktemp@0.3.5
│ │ │ ├── rimraf@2.2.8
│ │ │ └── underscore.string@2.3.3
│ │ └── rsvp@3.0.14
│ ├─┬ chalk@0.5.1
│ │ ├── ansi-styles@1.1.0
│ │ ├── escape-string-regexp@1.0.2
│ │ ├─┬ has-ansi@0.1.0
│ │ │ └── ansi-regex@0.2.0
│ │ ├─┬ strip-ansi@0.3.0
│ │ │ └── ansi-regex@0.2.1
│ │ └── supports-color@0.2.0
│ ├─┬ concat-stream@1.4.6
│ │ ├── inherits@2.0.1
│ │ ├─┬ readable-stream@1.1.13
│ │ │ ├── core-util-is@1.0.1
│ │ │ ├── isarray@0.0.1
│ │ │ └── string_decoder@0.10.31
│ │ └── typedarray@0.0.6
│ ├─┬ configstore@0.3.1
│ │ ├── graceful-fs@3.0.4
│ │ ├─┬ js-yaml@3.0.2
│ │ │ ├─┬ argparse@0.1.15
│ │ │ │ ├── underscore@1.4.4
│ │ │ │ └── underscore.string@2.3.3
│ │ │ └── esprima@1.0.4
│ │ ├── object-assign@0.3.1
│ │ ├── osenv@0.1.0
│ │ └── uuid@1.4.2
│ ├── core-object@0.0.2
│ ├── diff@1.0.8
│ ├─┬ express@4.9.7
│ │ ├─┬ accepts@1.1.2
│ │ │ ├─┬ mime-types@2.0.2
│ │ │ │ └── mime-db@1.1.0
│ │ │ └── negotiator@0.4.9
│ │ ├── cookie@0.1.2
│ │ ├── cookie-signature@1.0.5
│ │ ├─┬ debug@2.0.0
│ │ │ └── ms@0.6.2
│ │ ├── depd@0.4.5
│ │ ├── escape-html@1.0.1
│ │ ├─┬ etag@1.4.0
│ │ │ └── crc@3.0.0
│ │ ├── finalhandler@0.2.0
│ │ ├── fresh@0.2.4
│ │ ├── media-typer@0.3.0
│ │ ├── merge-descriptors@0.0.2
│ │ ├── methods@1.1.0
│ │ ├─┬ on-finished@2.1.0
│ │ │ └── ee-first@1.0.5
│ │ ├── parseurl@1.3.0
│ │ ├── path-to-regexp@0.1.3
│ │ ├─┬ proxy-addr@1.0.3
│ │ │ ├── forwarded@0.1.0
│ │ │ └── ipaddr.js@0.1.3
│ │ ├── qs@2.2.4
│ │ ├── range-parser@1.0.2
│ │ ├─┬ send@0.9.3
│ │ │ ├── destroy@1.0.3
│ │ │ ├── mime@1.2.11
│ │ │ └── ms@0.6.2
│ │ ├── serve-static@1.6.4
│ │ ├─┬ type-is@1.5.2
│ │ │ └─┬ mime-types@2.0.2
│ │ │   └── mime-db@1.1.0
│ │ ├── utils-merge@1.0.0
│ │ └── vary@1.0.0
│ ├─┬ findup@0.1.5
│ │ ├── colors@0.6.2
│ │ └── commander@2.1.0
│ ├─┬ fs-extra@0.12.0
│ │ └── jsonfile@2.0.0
│ ├── git-repo-info@1.0.2
│ ├─┬ glob@4.0.6
│ │ ├── graceful-fs@3.0.4
│ │ ├── inherits@2.0.1
│ │ └─┬ once@1.3.1
│ │   └── wrappy@1.0.1
│ ├── inflection@1.5.1
│ ├─┬ inquirer@0.5.1
│ │ ├── async@0.8.0
│ │ ├─┬ chalk@0.4.0
│ │ │ ├── ansi-styles@1.0.0
│ │ │ ├── has-color@0.1.7
│ │ │ └── strip-ansi@0.1.1
│ │ ├─┬ cli-color@0.3.2
│ │ │ ├── d@0.1.1
│ │ │ ├─┬ es5-ext@0.10.4
│ │ │ │ ├── es6-iterator@0.1.1
│ │ │ │ └── es6-symbol@0.1.1
│ │ │ ├─┬ memoizee@0.3.8
│ │ │ │ ├─┬ es6-weak-map@0.1.2
│ │ │ │ │ ├── es6-iterator@0.1.1
│ │ │ │ │ └── es6-symbol@0.1.1
│ │ │ │ ├── event-emitter@0.3.1
│ │ │ │ ├── lru-queue@0.1.0
│ │ │ │ └── next-tick@0.2.2
│ │ │ └─┬ timers-ext@0.1.0
│ │ │   └── next-tick@0.2.2
│ │ ├── lodash@2.4.1
│ │ └── mute-stream@0.0.4
│ ├── js-string-escape@1.0.0
│ ├─┬ leek@0.0.12
│ │ ├── lodash@2.4.1
│ │ └─┬ request@2.45.0
│ │   ├── aws-sign2@0.5.0
│ │   ├─┬ bl@0.9.3
│ │   │ └─┬ readable-stream@1.0.33-1
│ │   │   ├── core-util-is@1.0.1
│ │   │   ├── inherits@2.0.1
│ │   │   ├── isarray@0.0.1
│ │   │   └── string_decoder@0.10.31
│ │   ├── caseless@0.6.0
│ │   ├── forever-agent@0.5.2
│ │   ├─┬ form-data@0.1.4
│ │   │ ├── async@0.9.0
│ │   │ ├─┬ combined-stream@0.0.5
│ │   │ │ └── delayed-stream@0.0.5
│ │   │ └── mime@1.2.11
│ │   ├─┬ hawk@1.1.1
│ │   │ ├── boom@0.4.2
│ │   │ ├── cryptiles@0.2.2
│ │   │ ├── hoek@0.9.1
│ │   │ └── sntp@0.2.4
│ │   ├─┬ http-signature@0.10.0
│ │   │ ├── asn1@0.1.11
│ │   │ ├── assert-plus@0.1.2
│ │   │ └── ctype@0.5.2
│ │   ├── json-stringify-safe@5.0.0
│ │   ├── mime-types@1.0.2
│ │   ├── node-uuid@1.4.1
│ │   ├── oauth-sign@0.4.0
│ │   ├── qs@1.2.2
│ │   ├── stringstream@0.0.4
│ │   ├─┬ tough-cookie@0.12.1
│ │   │ └── punycode@1.3.1
│ │   └── tunnel-agent@0.4.0
│ ├── lodash-node@2.4.1
│ ├─┬ minimatch@1.0.0
│ │ ├── lru-cache@2.5.0
│ │ └── sigmund@1.0.0
│ ├─┬ mkdirp@0.5.0
│ │ └── minimist@0.0.8
│ ├─┬ morgan@1.3.2
│ │ ├── basic-auth@1.0.0
│ │ ├── depd@0.4.5
│ │ └─┬ on-finished@2.1.0
│ │   └── ee-first@1.0.5
│ ├── ncp@0.6.0
│ ├── nopt@3.0.1
│ ├─┬ npm@2.1.3
│ │ ├── abbrev@1.0.5
│ │ ├── ansi@0.3.0
│ │ ├── ansicolors@0.3.2
│ │ ├── ansistyles@0.1.3
│ │ ├── archy@0.0.2
│ │ ├── async-some@1.0.1
│ │ ├── block-stream@0.0.7
│ │ ├── char-spinner@1.0.1
│ │ ├── child-process-close@0.1.1
│ │ ├── chmodr@0.1.0
│ │ ├── chownr@0.0.1
│ │ ├── cmd-shim@2.0.1
│ │ ├─┬ columnify@1.2.1
│ │ │ ├─┬ strip-ansi@1.0.0
│ │ │ │ └── ansi-regex@0.2.1
│ │ │ └─┬ wcwidth@1.0.0
│ │ │   └─┬ defaults@1.0.0
│ │ │     └── clone@0.1.18
│ │ ├─┬ dezalgo@1.0.1
│ │ │ └── asap@1.0.0
│ │ ├── editor@0.1.0
│ │ ├── fs-vacuum@1.2.1
│ │ ├── fs-write-stream-atomic@1.0.2
│ │ ├── fstream@1.0.2
│ │ ├─┬ fstream-npm@1.0.0
│ │ │ └── fstream-ignore@1.0.1
│ │ ├── github-url-from-git@1.4.0
│ │ ├── github-url-from-username-repo@1.0.2
│ │ ├── glob@4.0.5
│ │ ├── graceful-fs@3.0.2
│ │ ├── inflight@1.0.3
│ │ ├── inherits@2.0.1
│ │ ├── ini@1.2.1
│ │ ├─┬ init-package-json@1.1.0
│ │ │ └── promzard@0.2.2
│ │ ├── lockfile@1.0.0
│ │ ├── lru-cache@2.5.0
│ │ ├─┬ minimatch@1.0.0
│ │ │ └── sigmund@1.0.0
│ │ ├─┬ mkdirp@0.5.0
│ │ │ └── minimist@0.0.8
│ │ ├── node-gyp@1.0.2
│ │ ├── nopt@3.0.1
│ │ ├── normalize-package-data@1.0.3
│ │ ├── npm-cache-filename@1.0.1
│ │ ├── npm-install-checks@1.0.4
│ │ ├── npm-package-arg@2.1.3
│ │ ├── npm-registry-client@3.2.2
│ │ ├── npm-user-validate@0.1.0
│ │ ├─┬ npmconf@2.1.0
│ │ │ └─┬ config-chain@1.1.8
│ │ │   └── proto-list@1.2.3
│ │ ├── npmlog@0.1.1
│ │ ├── once@1.3.0
│ │ ├── opener@1.3.0
│ │ ├── osenv@0.1.0
│ │ ├── path-is-inside@1.0.1
│ │ ├─┬ read@1.0.5
│ │ │ └── mute-stream@0.0.4
│ │ ├─┬ read-installed@3.1.3
│ │ │ ├── debuglog@1.0.1
│ │ │ ├── readdir-scoped-modules@1.0.0
│ │ │ └── util-extend@1.0.1
│ │ ├── read-package-json@1.2.7
│ │ ├─┬ readable-stream@1.0.32
│ │ │ ├── core-util-is@1.0.1
│ │ │ ├── isarray@0.0.1
│ │ │ └── string_decoder@0.10.31
│ │ ├── realize-package-specifier@1.1.0
│ │ ├─┬ request@2.44.0
│ │ │ ├── aws-sign2@0.5.0
│ │ │ ├── bl@0.9.3
│ │ │ ├── caseless@0.6.0
│ │ │ ├── forever-agent@0.5.2
│ │ │ ├─┬ form-data@0.1.4
│ │ │ │ ├── async@0.9.0
│ │ │ │ ├─┬ combined-stream@0.0.5
│ │ │ │ │ └── delayed-stream@0.0.5
│ │ │ │ └── mime@1.2.11
│ │ │ ├─┬ hawk@1.1.1
│ │ │ │ ├── boom@0.4.2
│ │ │ │ ├── cryptiles@0.2.2
│ │ │ │ ├── hoek@0.9.1
│ │ │ │ └── sntp@0.2.4
│ │ │ ├─┬ http-signature@0.10.0
│ │ │ │ ├── asn1@0.1.11
│ │ │ │ ├── assert-plus@0.1.2
│ │ │ │ └── ctype@0.5.2
│ │ │ ├── json-stringify-safe@5.0.0
│ │ │ ├── mime-types@1.0.2
│ │ │ ├── node-uuid@1.4.1
│ │ │ ├── oauth-sign@0.4.0
│ │ │ ├── qs@1.2.2
│ │ │ ├── stringstream@0.0.4
│ │ │ ├─┬ tough-cookie@0.12.1
│ │ │ │ └── punycode@1.3.1
│ │ │ └── tunnel-agent@0.4.0
│ │ ├── retry@0.6.0
│ │ ├── rimraf@2.2.8
│ │ ├── semver@4.0.0
│ │ ├── sha@1.2.4
│ │ ├── slide@1.1.6
│ │ ├── sorted-object@1.0.0
│ │ ├── tar@1.0.1
│ │ ├── text-table@0.2.0
│ │ ├── uid-number@0.0.5
│ │ ├── which@1.0.5
│ │ ├── wrappy@1.0.1
│ │ └── write-file-atomic@1.1.0
│ ├── pleasant-progress@1.0.2
│ ├── proxy-middleware@0.6.0
│ ├─┬ quick-temp@0.1.2
│ │ ├── mktemp@0.3.5
│ │ └── underscore.string@2.3.3
│ ├─┬ readline2@0.1.0
│ │ ├─┬ chalk@0.4.0
│ │ │ ├── ansi-styles@1.0.0
│ │ │ ├── has-color@0.1.7
│ │ │ └── strip-ansi@0.1.1
│ │ ├── lodash@2.4.1
│ │ └── mute-stream@0.0.4
│ ├── resolve@1.0.0
│ ├── rimraf@2.2.8
│ ├── rsvp@3.0.14
│ ├── semver@4.1.0
│ ├─┬ symlink-or-copy@1.0.1
│ │ └── copy-dereference@1.0.0
│ ├─┬ temp@0.8.1
│ │ └── rimraf@2.2.8
│ ├─┬ testem@0.6.22
│ │ ├── async@0.2.10
│ │ ├─┬ backbone@1.0.0
│ │ │ └── underscore@1.7.0
│ │ ├── charm@0.0.8
│ │ ├── colors@0.6.2
│ │ ├── commander@2.3.0
│ │ ├── consolidate@0.8.0
│ │ ├── did_it_work@0.0.6
│ │ ├─┬ express@3.1.0
│ │ │ ├── buffer-crc32@0.1.1
│ │ │ ├── commander@0.6.1
│ │ │ ├─┬ connect@2.7.2
│ │ │ │ ├── bytes@0.1.0
│ │ │ │ ├── formidable@1.0.11
│ │ │ │ ├── pause@0.0.1
│ │ │ │ └── qs@0.5.1
│ │ │ ├── cookie@0.0.5
│ │ │ ├── cookie-signature@0.0.1
│ │ │ ├── debug@0.7.2
│ │ │ ├── fresh@0.1.0
│ │ │ ├── methods@0.0.1
│ │ │ ├── mkdirp@0.3.3
│ │ │ ├── range-parser@0.0.4
│ │ │ └─┬ send@0.1.0
│ │ │   └── mime@1.2.6
│ │ ├─┬ fileset@0.1.5
│ │ │ └─┬ minimatch@0.4.0
│ │ │   ├── lru-cache@2.5.0
│ │ │   └── sigmund@1.0.0
│ │ ├─┬ fireworm@0.6.6
│ │ │ ├─┬ is-type@0.0.1
│ │ │ │ └── core-util-is@1.0.1
│ │ │ ├── lodash@2.3.0
│ │ │ └─┬ minimatch@0.2.14
│ │ │   ├── lru-cache@2.5.0
│ │ │   └── sigmund@1.0.0
│ │ ├─┬ glob@3.1.21
│ │ │ ├── graceful-fs@1.2.3
│ │ │ ├── inherits@1.0.0
│ │ │ └─┬ minimatch@0.2.14
│ │ │   ├── lru-cache@2.5.0
│ │ │   └── sigmund@1.0.0
│ │ ├── growl@1.7.0
│ │ ├─┬ http-proxy@0.10.4
│ │ │ ├─┬ optimist@0.6.1
│ │ │ │ ├── minimist@0.0.10
│ │ │ │ └── wordwrap@0.0.2
│ │ │ ├── pkginfo@0.3.0
│ │ │ └─┬ utile@0.2.1
│ │ │   ├── deep-equal@0.2.1
│ │ │   ├── i@0.3.2
│ │ │   └── ncp@0.4.2
│ │ ├─┬ js-yaml@2.1.3
│ │ │ ├─┬ argparse@0.1.15
│ │ │ │ ├── underscore@1.4.4
│ │ │ │ └── underscore.string@2.3.3
│ │ │ └── esprima@1.0.4
│ │ ├── mustache@0.4.0
│ │ ├─┬ npmlog@0.0.6
│ │ │ └── ansi@0.2.1
│ │ ├─┬ socket.io@0.9.17
│ │ │ ├── base64id@0.1.0
│ │ │ ├── policyfile@0.0.4
│ │ │ ├── redis@0.7.3
│ │ │ └─┬ socket.io-client@0.9.16
│ │ │   ├─┬ active-x-obfuscator@0.0.1
│ │ │   │ └── zeparser@0.0.5
│ │ │   ├── uglify-js@1.2.5
│ │ │   ├─┬ ws@0.4.32
│ │ │   │ ├── commander@2.1.0
│ │ │   │ ├── nan@1.0.0
│ │ │   │ ├── options@0.0.6
│ │ │   │ └── tinycolor@0.0.1
│ │ │   └── xmlhttprequest@1.4.2
│ │ ├── styled_string@0.0.1
│ │ ├─┬ tap@0.4.13
│ │ │ ├── buffer-equal@0.0.1
│ │ │ ├── deep-equal@0.0.0
│ │ │ ├─┬ difflet@0.2.6
│ │ │ │ ├── charm@0.1.2
│ │ │ │ ├── deep-is@0.1.3
│ │ │ │ └── traverse@0.6.6
│ │ │ ├─┬ glob@3.2.11
│ │ │ │ └─┬ minimatch@0.3.0
│ │ │ │   ├── lru-cache@2.5.0
│ │ │ │   └── sigmund@1.0.0
│ │ │ ├── inherits@2.0.1
│ │ │ ├── nopt@2.2.1
│ │ │ ├─┬ runforcover@0.0.2
│ │ │ │ └─┬ bunker@0.1.2
│ │ │ │   └─┬ burrito@0.2.12
│ │ │ │     ├── traverse@0.5.2
│ │ │ │     └── uglify-js@1.1.1
│ │ │ ├── slide@1.1.6
│ │ │ └── yamlish@0.0.6
│ │ └── xml-escape@1.0.0
│ ├── through@2.3.6
│ ├─┬ tiny-lr@0.1.4
│ │ ├─┬ body-parser@1.8.4
│ │ │ ├── bytes@1.0.0
│ │ │ ├── depd@0.4.5
│ │ │ ├── iconv-lite@0.4.4
│ │ │ ├── media-typer@0.3.0
│ │ │ ├─┬ on-finished@2.1.0
│ │ │ │ └── ee-first@1.0.5
│ │ │ ├── raw-body@1.3.0
│ │ │ └─┬ type-is@1.5.2
│ │ │   └─┬ mime-types@2.0.2
│ │ │     └── mime-db@1.1.0
│ │ ├── debug@0.8.1
│ │ ├─┬ faye-websocket@0.7.3
│ │ │ └── websocket-driver@0.3.6
│ │ ├── parseurl@1.3.0
│ │ └── qs@2.2.4
│ ├── walk-sync@0.1.3
│ └─┬ yam@0.0.16
│   ├─┬ findup@0.1.5
│   │ ├── colors@0.6.2
│   │ └── commander@2.1.0
│   ├─┬ fs-extra@0.8.1
│   │ ├── jsonfile@1.1.1
│   │ ├── mkdirp@0.3.5
│   │ ├── ncp@0.4.2
│   │ └── rimraf@2.2.8
│   └── lodash@2.4.1
├── ember-cli-content-security-policy@0.3.0
├─┬ ember-cli-ic-ajax@0.1.1
│ └── ic-ajax@2.0.2
├─┬ ember-cli-inject-live-reload@1.3.0
│ └── connect-livereload@0.4.1
├── ember-cli-qunit@0.1.0
├── ember-data@1.0.0-beta.10
├── ember-export-application-global@1.0.1
├─┬ express@4.10.4
│ ├─┬ accepts@1.1.3
│ │ ├─┬ mime-types@2.0.3
│ │ │ └── mime-db@1.2.0
│ │ └── negotiator@0.4.9
│ ├── content-disposition@0.5.0
│ ├── cookie@0.1.2
│ ├── cookie-signature@1.0.5
│ ├─┬ debug@2.1.0
│ │ └── ms@0.6.2
│ ├── depd@1.0.0
│ ├── escape-html@1.0.1
│ ├─┬ etag@1.5.1
│ │ └── crc@3.2.1
│ ├── finalhandler@0.3.2
│ ├── fresh@0.2.4
│ ├── media-typer@0.3.0
│ ├── merge-descriptors@0.0.2
│ ├── methods@1.1.0
│ ├─┬ on-finished@2.1.1
│ │ └── ee-first@1.1.0
│ ├── parseurl@1.3.0
│ ├── path-to-regexp@0.1.3
│ ├─┬ proxy-addr@1.0.4
│ │ ├── forwarded@0.1.0
│ │ └── ipaddr.js@0.1.5
│ ├── qs@2.3.3
│ ├── range-parser@1.0.2
│ ├─┬ send@0.10.1
│ │ ├── destroy@1.0.3
│ │ ├── mime@1.2.11
│ │ └── ms@0.6.2
│ ├── serve-static@1.7.1
│ ├─┬ type-is@1.5.3
│ │ └─┬ mime-types@2.0.3
│ │   └── mime-db@1.2.0
│ ├── utils-merge@1.0.0
│ └── vary@1.0.0
└─┬ glob@4.3.1
  ├─┬ inflight@1.0.4
  │ └── wrappy@1.0.1
  ├── inherits@2.0.1
  ├─┬ minimatch@2.0.1
  │ └─┬ brace-expansion@1.0.1
  │   ├── balanced-match@0.2.0
  │   └── concat-map@0.0.0
  └─┬ once@1.3.1
    └── wrappy@1.0.1

@rwjblue
Copy link
Member

rwjblue commented Dec 6, 2014

Yes, you will also need to npm cache clean potentially.

@elwayman02
Copy link
Contributor Author

Deleted npm/bower folders, re-installed dependencies. I'm on symlink-or-copy 1.0.1 for sure this time.

Build successful - 150915ms.

Slowest Trees                  | Total          
-------------------------------+----------------
TreeMerger (appAndDependencies) | 28763ms        
JSHint - App                   | 18853ms        
TreeMerger (stylesAndVendor)   | 16153ms        
ES6Concatenator                | 14840ms        
LessCompiler                   | 8849ms         
TreeMerger (ExternalTree)      | 8317ms     

Tried updating npm but it just gave me the same version again, lol.

Going to try deleting un-imported files as suggested to see what happens.

@stefanpenner
Copy link
Contributor

it may be the shear number of roots we are importing from your vendor tree. If we can omit those, and see the result it will help give us more info.

@elwayman02
Copy link
Contributor Author

@rwjblue this isn't looking feasible...build keeps failing because of stuff I deleted that wasn't directly imported via app.import. Broccoli-sane-watcher is going insane.

@stefanpenner
Copy link
Contributor

Broccoli-sane-watcher is going insane.

explain this further please.

How is that reproduction example coming?

@elwayman02
Copy link
Contributor Author

@stefanpenner I just meant that it's throwing a lot of errors about trying to watch files that don't exist (because I was trying to delete everything that isn't explicitly imported in the brocfile). I haven't been able to create a version of our app with files deleted where the build process actually completes yet.

@stefanpenner
Copy link
Contributor

@elwayman02 hows the example project coming?

@elwayman02
Copy link
Contributor Author

I haven't had time to work on it...will try something this week hopefully. I'm running out of time before they take my windows machine away, so I need to do it soon. =P

@elwayman02
Copy link
Contributor Author

@stefanpenner in the meantime I ran ember server on our sample project that we've put together to help teams get started with an ember app quickly. It has about 28 files and maybe 2 dozen dependencies; a lot lighter than our actual project.

ember.cmd s
version: 0.1.5
Livereload server on port 35729
Serving on http://0.0.0.0:4200/

Build successful - 48724ms.

Slowest Trees                  | Total          
-------------------------------+----------------
CustomStaticCompiler           | 6369ms         
TreeMerger (appAndDependencies) | 6208ms         
LessCompiler                   | 5457ms         
TreeMerger (ExternalTree)      | 4939ms         
TreeMerger (stylesAndVendor)   | 4671ms  

The build time was still incredibly long for how lightweight the application is. Maybe we can work from this sample application rather than my main one, which is a lot harder to pick apart?

@elwayman02
Copy link
Contributor Author

Package.json (edited to remove 3 internal dependencies):

"dependencies": {
    "express": "^4.8.5",
    "glob": "^4.0.5"
  },
  "devDependencies": {
    "morgan": "^1.5.0",
    "bower": "^1.3.12",
    "broccoli-asset-rev": "^1.0.0",
    "broccoli-ember-hbs-template-compiler": "git://github.com/toranb/broccoli-ember-hbs-template-compiler.git#ab7ecc75f3180bc6a99adf5275a7626b37c1e28e",
    "ember-cli-dependency-checker": "0.0.6",
    "ember-cli-ic-ajax": "0.1.1",
    "ember-cli-inject-live-reload": "^1.3.0",
    "ember-cli-less": "^1.0.5",
    "ember-cli-qunit": "0.1.2",
    "ember-cli": "0.1.5",
    "ember-data": "1.0.0-beta.12",
    "ember-export-application-global": "^1.0.0"
  }

Bower.json (removed 1 internal dependency)

  "dependencies": {
    "ember": "~1.9.1",
    "ember-cli-shims": "stefanpenner/ember-cli-shims#0.0.3",
    "ember-cli-test-loader": "rwjblue/ember-cli-test-loader#0.0.4",
    "ember-data": "1.0.0-beta.12",
    "ember-load-initializers": "stefanpenner/ember-load-initializers#0.0.2",
    "ember-qunit": "0.1.8",
    "ember-qunit-notifications": "0.0.4",
    "ember-resolver": "~0.1.10",
    "ember-testing-httpRespond": "git@github.com:rjackson/ember-testing-httpRespond.git#e36a0b23c1c63648fbad7f863a96d6f7398ceea9",
    "handlebars": "~2.0.0",
    "jquery": "^1.11.1",
    "loader.js": "stefanpenner/loader.js#1.0.1",
    "qunit": "~1.16.0",
    "moment": "~2.8.4",
    "lodash": "~2.4.1",
    "velocity": "~1.1.0",
    "jquery-mousewheel": "~3.1.12"
  }

The main thing missing is that we have an internal version of bootstrap included as well, which adds some heft to the dependency chain.

Brocfile.js

var EmberApp = require('ember-cli/lib/broccoli/ember-app');
var app      = new EmberApp();
var bower    = app.trees.bower.dir;

app.import(bower + '/moment/moment.js');

app.import({
    development: bower + '/lodash/dist/lodash.underscore.js',
    production:  bower + '/lodash/dist/lodash.underscore.min.js'
});

module.exports = app.toTree();

@stefanpenner
Copy link
Contributor

ya still seems long, my windows clients app is hundreds of modules and many dependencies and they have 2s incremental builds.

Wish i could just have your machine infront of me.

@elwayman02
Copy link
Contributor Author

@stefanpenner you're gonna love this...we recently upgraded our main app to 0.1.5 with ember-cli-6to5 brought in...now my build times are around 700,000 ms...nearly tripled xD

@stefanpenner
Copy link
Contributor

@stefanpenner you're gonna love this...we recently upgraded our main app to 0.1.5 with ember-cli-6to5 brought in...now my build times are around 700,000 ms...nearly tripled xD

so after investigating @elwayman02 machine, there where some issues.

  • ls in git bash also took about 10s for 20 files
  • he was using a version of windows without symlink support

@felixrieseberg this is likely a topic we should chat about when it comes to windows ergonomics.

@quantuminformation
Copy link
Contributor

Does any have a ballpark figure of how the speed compares with a similar spec mac and pc with 8.1 with ssd. Lets say the mac is the new pro 13 2015.

@pjcarly
Copy link

pjcarly commented Aug 24, 2015

I just updated my ember-cli in my project from 1.13.1 to 1.13.8, and the buildtimes went up considerably, I used to get build times on the same project with literally nothing changed (except for the updates of ember-cli) of about 2 seconds, but after the update, I'm looking at 2 minutes (!) build time.

Tested on Windows 10 - 6GB Ram - SSD.

To get an indication what changed,
change in my bower.json

{
    "ember-data": "2.0.0", [FROM: 2.0.0-beta.1]
    "ember-qunit": "0.4.9", [FROM 0.4.1]
    "jquery": "^1.11.3", [FROM 1.11.1]
    "loader.js": "ember-cli/loader.js#3.2.1", [FROM 3.2.0]
    "qunit": "~1.18.0" [FROM 1.17.1]
  }
}

Changes in dependencies in package.json

  "devDependencies": {
    "broccoli-asset-rev": "^2.1.2", [FROM 2.0.2]
    "ember-cli": "1.13.8", [FROM 1.13.1]
    "ember-cli-app-version": "0.5.0", [FROM 0.4.0]
    "ember-cli-babel": "^5.1.3", [FROM 5.0.0]
    "ember-cli-dependency-checker": "^1.0.1", [FROM 1.0.0]
    "ember-cli-htmlbars-inline-precompile": "^0.2.0", [FROM 0.1.1]
    "ember-cli-inject-live-reload": "^1.3.1", [FROM 1.3.0]
    "ember-cli-qunit": "^1.0.0", [FROM 0.3.15]
    "ember-cli-uglify": "^1.2.0", [FROM 1.0.1]
    "ember-cli-sri": "^1.0.3", [NEW]
    "ember-disable-proxy-controllers": "^1.0.0",
  },
  "dependencies": {
    "ember-export-application-global": "^1.0.3" [NEW, used to be in DEV Dependencies]
  }

@elwayman02
Copy link
Contributor Author

@pjcarly it's probably best to create a new issue for this

@stefanpenner
Copy link
Contributor

I'm looking at 2 minutes (!) build time.

2 minutes === symlinks aren't setup, please be sure to review the windows guide on the website.

I was testing windows 1.13.0 and 1.13.8 and master all weekend and was not seeing this regression (even on large apps).

@pjcarly
Copy link

pjcarly commented Aug 25, 2015

Awesome, it was symlinks indeed. For anyone finding this comment in the future, the fix for windows is setting up Symlinks:

http://www.ember-cli.com/user-guide/#symlinks-on-windows

@stefanpenner
Copy link
Contributor

@pjcarly master of cli actually tests and logs this. I suspect this will help future issues.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

7 participants