bem-archive / bem-tools

Toolkit to work with files based on BEM methodology
http://bem.info/tools/bem/
MIT License
395 stars 72 forks source link

Make не замечает изменений в bemtree-файлах #519

Closed tenorok closed 9 years ago

tenorok commented 10 years ago

Делаю проект: https://github.com/tenorok/dynamic-bem-site/tree/dev

Опишу проблему на примере этого проекта.

git clone -b dev git@github.com:tenorok/dynamic-bem-site.git
cd dynamic-bem-site
npm install
./node_modules/.bin/bem make libs
./node_modules/.bin/bem make desktop.bundles/index
node index.js

Моя цель: организовать проект так, чтобы можно было запустить один раз 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.

arikon commented 10 years ago

@SevInf @scf2k Помогите разобраться, пожалуйста

scf2k commented 10 years ago

@tenorok уточни пожалуйста что именно у тебя не пересобирается? Я проверил просто с bem сервером, и файл index.bemtree.js пересобирается при изменениях в page.bemtree.

qfox commented 10 years ago

Это не make в ветке debug-make fs.readFileSync(BEMTREEFile, 'utf-8') — не перезагружает файл

tenorok commented 10 years ago

@zxqfox я смотрю сам файл на файловой системе, он не меняется

qfox commented 10 years ago

@tenorok Хотя да, make. Смотрю почему.

tenorok commented 10 years ago

Наверное я что-то не правильно делаю, потому что если перезапустить команду node index.js то при первом запросе bemtree собирается правильно, а при последующих уже не видит изменений.

qfox commented 10 years ago

не ты один ;-)

qfox commented 10 years ago

Запускаю node debug index.js — форк повисает и не дохнет. Приходится руками убивать

qfox commented 10 years ago

bemtree собирается из блоков, я в page/bemtree вставил строку, она не пересобирается, хотя и isValid на бандловом index/bemtree не проходит и запускает пересборку bemtree. Пересборка проходит, данные не меняются. я так глубоко еще не копал ;-(

qfox commented 10 years ago
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 — все ок начинает делаться. можно использовать как временное решение

qfox commented 10 years ago

Хотя, судя по 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();
qfox commented 10 years ago

@tenorok устроит пока такое решение?

@scf2k Все-таки повторный вызов make через api по какой-то причине не пересобирает bemtree ;-(

tenorok commented 10 years ago

@zxqfox спасибо большое! Очень выручил!

scf2k commented 10 years ago

@tenorok так зачем ты закрыл? :) Баг то не починили пока.

tenorok commented 10 years ago

@scf2k не знаю, на радостях, что моя проблема решилась :)

scf2k commented 10 years ago

@tenorok если тебя это решение пока устраивает (к демонстрации), то мы займемся починкой попозже.

tenorok commented 10 years ago

Да, мне это решение подходит, спасибо!

tenorok commented 10 years ago

Мне оставить веточку debug-make? Или можно удалять?

scf2k commented 10 years ago

@tenorok если там затычка для монго то оставь

qfox commented 10 years ago

@scf2k да, там была затычка @tenorok оставь, да

tenorok commented 10 years ago

По аналогии сделал удаление депсов, CSS и JS: https://github.com/tenorok/dynamic-bem-site/blob/dev/bundle.js#L75

scf2k commented 10 years ago

@tenorok кажется что проще и удобнее было бы запускать bem make через exec

tenorok commented 10 years ago

Из-за этого бага возникла ещё одна проблема. Саджест Я.Браузера отправляет запрос при изменении url'а, потом ещё при нажатии ентера отправляется ещё один запрос, получается, что запускается две сборки. И после того, как завершится первая сборка, браузеру отправляется ответ, в этот момент начинается вторая, удаляются собранные css- и js-файлы, и когда страница в браузере сформирована, он получает 404 вместо css и js.

Поэтому пока что заменил bem.api на exec.

scf2k commented 10 years ago

@tenorok получится что ты запустишь два процесса сборки через exec. Так?

tenorok commented 10 years ago

@scf2k да, но в этом случае файлы перезатираются автоматически и такой проблемы не возникает.

qfox commented 10 years ago

@scf2k Это же не повод не чинить? Зачем-то этот функционал был выброшен в exports? Если по ошибке, то может в api.make лучше вставить throw new Error("use exec ... instead")?

qfox commented 10 years ago

@tenorok Если руками затираешь, то можно так же руками проверять время модификации и или флаги для файлов в памяти хранить о том, что их сборка в процессе.

qfox commented 10 years ago

@scf2k Вообще, может быть можно костыликов навставлять, чтобы оно не пересобирало лишнее и, зная какие исходные файлы влияют на результат, вычисляло бы, стоит ли делать пересборку? Параллельные сборки через exec никак ведь не порулишь элегантно, т.е. это уже не проще, да?

scf2k commented 10 years ago

@tenorok я нашел в чем дело. Уровни кешируются и чтобы подхватывались изменения кеш надо сбрасывать. Это сделано в bem server, смотри тут https://github.com/bem/bem-tools/blob/v0.6.16/lib/base-server.js#L190

tenorok commented 10 years ago

@scf2k в bem.api нельзя каким-нибудь способ сказать, что мне нужно очищать кэш? Или это надо сделать по аналогии с бэм-сервером?

scf2k commented 10 years ago

@tenorok

BEM.require('./level').resetLevelsCache();
tenorok commented 10 years ago

@scf2k спасибо большое! Так и наисал, отлично работает: https://github.com/tenorok/dynamic-bem-site/blob/bemup/bundle.js#L85

Но всё же, я правильно понимаю, что это должно выполняться автоматически при использовании bem.api?

qfox commented 10 years ago

@tenorok должно ли автоматически — вопрос, зависящий от env. в production, наверное, нет. в dev, наверное, да

tenorok commented 10 years ago

@zxqfox в production вообще нужен ли make? Ведь уже всё собрано заранее.

scf2k commented 10 years ago

@tenorok дело в том, что он всегда вызыватется через api. Просто в твоем случае из внешней программы, а в случае с bem server из кода самой команды bem. Может быть нужно подумать о дополнительных параметрах для bem make, которые заставят сбросить кеш. Или наоборот, подефолтку он будет всегда сбрасываться, а параметром можно будет это отменить.

tenorok commented 10 years ago

@scf2k ага, я понимаю, это и имел ввиду. Issue закрывайте по своему усмотрению. Спасибо за помощь.

qfox commented 10 years ago

@tenorok в идеале — да. идеалом будут в идеале максимум 10-15%. взять тот же rails — там сборка по запросу ;-) только недавно появилось rake:build_assets, но не все этим пользуются. людям, которые собирают сайты по фтп сразу на сервере — никогда не объяснить, что есть капистрано или docker ;-)

qfox commented 10 years ago

@tenorok да и всегда есть риск, что что-то забыл собрать. мир не идеален

qfox commented 10 years ago

@scf2k честно говоря, я не уверен, что это нужно фиксить. Но это кеш, и инвалидация кеша была бы полезна.