Closed tenorok closed 9 years ago
@SevInf @scf2k Помогите разобраться, пожалуйста
@tenorok уточни пожалуйста что именно у тебя не пересобирается? Я проверил просто с bem сервером, и файл index.bemtree.js пересобирается при изменениях в page.bemtree.
Это не make в ветке debug-make fs.readFileSync(BEMTREEFile, 'utf-8') — не перезагружает файл
@zxqfox я смотрю сам файл на файловой системе, он не меняется
@tenorok Хотя да, make. Смотрю почему.
Наверное я что-то не правильно делаю, потому что если перезапустить команду node index.js
то при первом запросе bemtree
собирается правильно, а при последующих уже не видит изменений.
не ты один ;-)
Запускаю node debug index.js
— форк повисает и не дохнет. Приходится руками убивать
bemtree собирается из блоков, я в page/bemtree вставил строку, она не пересобирается, хотя и isValid на бандловом index/bemtree не проходит и запускает пересборку bemtree. Пересборка проходит, данные не меняются. я так глубоко еще не копал ;-(
19:31:26.692 - info: [t] isValid() time for "desktop.bundles/index/index.bemtree" [1]: 1ms
19:31:26.692 - info: [*] make 'desktop.bundles/index/index.bemtree' [1]
require.cache не спасет если насильно замувать файл ./desktop.bundles/index/index.bemtree.js — все ок начинает делаться. можно использовать как временное решение
Хотя, судя по mtime — пересборка не проходит. Файл не перезаписывается по какой-то причине ;-\
@tenorok В bundle.js
добавь
var info = this.info || this.getInfo();
fs.unlinkSync(info.BEMTREEFile); // ← это
vow.when(bem.api.make({ verbosity: 'silly' }, [info.bundlePath])).then(function() {
this.info.BEMTREE = this._getBEMTREE(info.BEMTREEFile);
next();
}.bind(this)).done();
@tenorok устроит пока такое решение?
@scf2k Все-таки повторный вызов make
через api по какой-то причине не пересобирает bemtree ;-(
@zxqfox спасибо большое! Очень выручил!
@tenorok так зачем ты закрыл? :) Баг то не починили пока.
@scf2k не знаю, на радостях, что моя проблема решилась :)
@tenorok если тебя это решение пока устраивает (к демонстрации), то мы займемся починкой попозже.
Да, мне это решение подходит, спасибо!
Мне оставить веточку debug-make? Или можно удалять?
@tenorok если там затычка для монго то оставь
@scf2k да, там была затычка @tenorok оставь, да
По аналогии сделал удаление депсов, CSS и JS: https://github.com/tenorok/dynamic-bem-site/blob/dev/bundle.js#L75
@tenorok кажется что проще и удобнее было бы запускать bem make через exec
Из-за этого бага возникла ещё одна проблема. Саджест Я.Браузера отправляет запрос при изменении url'а, потом ещё при нажатии ентера отправляется ещё один запрос, получается, что запускается две сборки. И после того, как завершится первая сборка, браузеру отправляется ответ, в этот момент начинается вторая, удаляются собранные css- и js-файлы, и когда страница в браузере сформирована, он получает 404 вместо css и js.
Поэтому пока что заменил bem.api на exec.
@tenorok получится что ты запустишь два процесса сборки через exec. Так?
@scf2k да, но в этом случае файлы перезатираются автоматически и такой проблемы не возникает.
@scf2k Это же не повод не чинить? Зачем-то этот функционал был выброшен в exports
? Если по ошибке, то может в api.make
лучше вставить throw new Error("use exec ... instead")
?
@tenorok Если руками затираешь, то можно так же руками проверять время модификации и или флаги для файлов в памяти хранить о том, что их сборка в процессе.
@scf2k Вообще, может быть можно костыликов навставлять, чтобы оно не пересобирало лишнее и, зная какие исходные файлы влияют на результат, вычисляло бы, стоит ли делать пересборку? Параллельные сборки через exec
никак ведь не порулишь элегантно, т.е. это уже не проще, да?
@tenorok я нашел в чем дело. Уровни кешируются и чтобы подхватывались изменения кеш надо сбрасывать. Это сделано в bem server, смотри тут https://github.com/bem/bem-tools/blob/v0.6.16/lib/base-server.js#L190
@scf2k в bem.api
нельзя каким-нибудь способ сказать, что мне нужно очищать кэш? Или это надо сделать по аналогии с бэм-сервером?
@tenorok
BEM.require('./level').resetLevelsCache();
@scf2k спасибо большое! Так и наисал, отлично работает: https://github.com/tenorok/dynamic-bem-site/blob/bemup/bundle.js#L85
Но всё же, я правильно понимаю, что это должно выполняться автоматически при использовании bem.api
?
@tenorok должно ли автоматически — вопрос, зависящий от env. в production
, наверное, нет. в dev
, наверное, да
@zxqfox в production
вообще нужен ли make
? Ведь уже всё собрано заранее.
@tenorok дело в том, что он всегда вызыватется через api. Просто в твоем случае из внешней программы, а в случае с bem server из кода самой команды bem. Может быть нужно подумать о дополнительных параметрах для bem make, которые заставят сбросить кеш. Или наоборот, подефолтку он будет всегда сбрасываться, а параметром можно будет это отменить.
@scf2k ага, я понимаю, это и имел ввиду. Issue закрывайте по своему усмотрению. Спасибо за помощь.
@tenorok в идеале — да. идеалом будут в идеале максимум 10-15%. взять тот же rails
— там сборка по запросу ;-) только недавно появилось rake:build_assets, но не все этим пользуются. людям, которые собирают сайты по фтп сразу на сервере — никогда не объяснить, что есть капистрано или docker ;-)
@tenorok да и всегда есть риск, что что-то забыл собрать. мир не идеален
@scf2k честно говоря, я не уверен, что это нужно фиксить. Но это кеш, и инвалидация кеша была бы полезна.
Делаю проект: https://github.com/tenorok/dynamic-bem-site/tree/dev
Опишу проблему на примере этого проекта.
Моя цель: организовать проект так, чтобы можно было запустить один раз
node index.js
и потом просто разрабатываться, а по обновлению страницы пересобирать проект.При запросе на http://localhost:3000/ запускается сборка
make desktop.bundles/index
.Однако, если внести изменения, например, в файл
desktop.blocks/page/page.bemtree
, то bem-tools эти изменения не заметит.При этом, если внести изменения в
desktop.bundles/index/index.bemdecl.js
, то они будут замечены.Здесь я запускаю make: https://github.com/tenorok/dynamic-bem-site/blob/dev/bundle.js#L79 Пробовал добавлять сюда флаг
force: true
, с ним изменения вpage.bemtree
обнаруживаются.На сколько я понял, проблема в bem-tools.