Подтвердить что ты не робот

Как отлаживать медленные сборки Ember CLI/Broccoli

Мой проект Ember CLI в настоящее время занимает 8-9 секунд, и я хотел бы понять, почему. Проект не такой большой (~ 180 файлов под app/ включая hbs и scss).

Здесь мой brocfile: https://gist.github.com/samselikoff/874c90758bb2ce0bb210

Однако, даже если я комментирую весь свой Brocfile и экспортирую только переменную app, сборка все равно занимает 5-6 секунд.

Я не совсем уверен, как отлаживать. Здесь мои самые медленные журналы дерева:

Построить успешно - 8874мс.

Slowest Trees                  | Total          
-------------------------------+----------------
TreeMerger (appAndDependencies)| 1286ms         
TreeMerger (vendor)            | 1275ms         
CompassCompiler                | 1204ms         
StaticCompiler                 | 1185ms         
TreeMerger (stylesAndVendor)   | 1151ms         
TreeMerger (allTrees)          | 706ms          
StaticCompiler                 | 625ms    
4b9b3361

Ответ 1

ОБНОВЛЕНИЕ: Если вы используете ember-cli версию 0.1.0 или новее, этот хак, вероятно, не нужен. ember-cli теперь символические файлы вместо копирования. Вы все еще можете улучшить производительность на окнах или медленных дисках.


Брокколи (используется ember-cli) сохраняет свое временное состояние в файловой системе, поэтому он очень зависит от ввода-вывода файла. Попробуйте уменьшить количество файлов в каталогах public/, vendor/ и bower_components/. Все файлы внутри этих папок будут скопированы как минимум один раз за цикл восстановления. Размер и количество файлов в папках сильно влияют на производительность.

По сути, каждый раз, когда вы меняете файл, брокколи копирует файлы между многими каталогами внутри <ember app>/tmp/. В случае с вашим bower_components/ dir, он, кажется, копирует каждый отдельный файл более одного раза. Это нужно сделать, потому что вы можете использовать app.import('some.js') в своем Brocfile.js, вы также можете @import "some.scss" в файлах SASS/LESS. Невозможно узнать, какие файлы вам действительно нужны, поэтому он копирует их все.

Если вы удалите файлы, которые вам не нужны, от bower_components/ и vendor/, вы увидите лучшее время сборки.

Пример реального мира

Если вы устанавливаете зависимость bower highcharts.com#3.0.5, вы также получаете специальный подарок из 2829 файлов (198 МБ) в директории bower_components/. Представьте себе, что ненужная файловая система читает и копирует, что там происходит.

Вот фрагмент моей очищенной структуры:

$ find bower_components -type f | grep highcharts
bower_components/highcharts.com/js/highcharts-more.src.js
bower_components/highcharts.com/js/highcharts.src.js

Обратите внимание, что остались только файлы .js, я удалил все остальное. Это 2827 удаленных файлов. Highcharts - экстремальный пример, но большинство ваших зависимостей имеют в 5 раз больше файлов, чем вам действительно нужно.

Позитивное будущее впереди

Команда ember-cli работает над улучшением работы базовой экосистемы брокколи. Работа уже началась, и некоторые приложения реального мира (с большими деревьями) видят улучшения производительности, сокращающие время восстановления от 4 секунд до 600 мс. Использование символических ссылок вместо копирования показывает резкие улучшения.

Для тех из нас, у кого есть приложения большого масштаба, множество дебаффов и многие члены команды плача, которым сейчас нужно решение:

Временное решение

Один из способов сохранить ваш bower_components/ чистый, - проверить зависимости в управлении версиями. Это позволяет использовать git clean для упрощения работы с каталогом:

bower install —-save d3
git add -—force bower_components/d3/d3.js # force, because bower_components/ is gitignored
git commit -m "Added d3.js"

// Brocfile.js
app.import('bower_components/d3/d3.js');

Каждый раз, когда вы делаете bower install, вы, скорее всего, получите все лишнее крушение в своей директории. git clean легко удаляет файлы, не контролируемые версией:

git clean -f -d -x bower_components/
ember serve

После этого потребовалось одно перестроение (время для создания после изменения файла) с 20 секунд до 3,5 секунд (у нас есть довольно большое приложение).

Если вы идете по этому пути, не забывайте о дебатах колоды, необходимых для Ember:

bower_components/ember/ember.js
bower_components/ember/ember.prod.js
bower_components/ember-cli-shims/app-shims.js
bower_components/ember-cli-test-loader/test-loader.js
bower_components/ember-data/ember-data.js
bower_components/ember-data/ember-data.prod.js
bower_components/ember-load-initializers/ember-load-initializers.js
bower_components/ember-resolver/dist/modules/ember-resolver.js
bower_components/jquery/dist/jquery.js
bower_components/loader/loader.js
bower_components/handlebars/handlebars.js
bower_components/handlebars/handlebars.runtime.js

Здесь команда git для вас:

bower install
git add -f bower_components/ember/ember.js bower_components/ember/ember.prod.js  bower_components/ember-cli-shims/app-shims.js  bower_components/ember-cli-test-loader/test-loader.js  bower_components/ember-data/ember-data.js  bower_components/ember-data/ember-data.prod.js  bower_components/ember-load-initializers/ember-load-initializers.js  bower_components/ember-resolver/dist/modules/ember-resolver.js  bower_components/jquery/dist/jquery.js  bower_components/loader/loader.js  bower_components/handlebars/handlebars.js bower_components/handlebars/handlebars.runtime.js
git commit -m "Added ember-cli dependencies"
git clean -f -d -x bower_components/

Ответ 2

В дополнение к ответу @tstirrat:

Только запуск с правами администратора позволит вам использовать файлы symlinks (По умолчанию флаг SeCreateSymbolicLinkPrivilege) попробуйте запустить cmd (или PowerShell) в качестве администратора и посмотреть, помогает ли он.

Вы можете разрешить его для конкретного пользователя, используя конфигурацию Local Policies.

Ответ отсюда