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

File cache #449

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open

File cache #449

wants to merge 5 commits into from

Conversation

j0tunn
Copy link
Contributor

@j0tunn j0tunn commented Apr 21, 2016

TODO:

  • do not read cache files from previous build in case of --no-cache option specified
  • tests for FileCache

@j0tunn j0tunn mentioned this pull request Apr 21, 2016
@j0tunn j0tunn force-pushed the feature/file.cache branch 2 times, most recently from 9e1068f to f6ca91e Compare April 25, 2016 15:11
@j0tunn j0tunn changed the title [WIP] File cache File cache Apr 25, 2016
@j0tunn
Copy link
Contributor Author

j0tunn commented Apr 25, 2016

@arikon @blond Take a look please

put: function (cacheKey, content) {
return vowFs.makeDir(this._cacheDir)
.then(function () {
this.put = this._put;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Я бы написал объясняющий коммент

@j0tunn
Copy link
Contributor Author

j0tunn commented Apr 26, 2016

Подумал - плохо, что методы drop и allowOldFiles доступны в технологиях. Буду переделывать, можно пока больше не смотреть.

@j0tunn j0tunn force-pushed the feature/file.cache branch 2 times, most recently from 2a1daf9 to 3d1901e Compare April 27, 2016 10:03
@j0tunn
Copy link
Contributor Author

j0tunn commented Apr 27, 2016

@j0tunn j0tunn force-pushed the feature/file.cache branch from b36af8f to b11fc77 Compare April 27, 2016 11:12
@j0tunn
Copy link
Contributor Author

j0tunn commented Apr 27, 2016

🆙

@@ -83,7 +83,7 @@
},
"main": "lib/api/index",
"scripts": {
"test": "npm run jshint && npm run check-style && npm run unit-test && npm run tech-test",
"test": "npm run unit-test",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Забыл вернуть обратно?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ага

@j0tunn j0tunn force-pushed the feature/file.cache branch 2 times, most recently from 6e2da87 to d4f1e18 Compare May 17, 2016 11:49
@j0tunn
Copy link
Contributor Author

j0tunn commented May 17, 2016

🆙

  • унес FileCache в Cache: теперь там появились методы cache.getFile и cache.putFile
  • поправил логику обработки опции --no-cache: не прокидываем опцию в конструктор, а вызываем drop снаружи. Связанные pr в magic-factory и magic-platform поправил

@@ -14,13 +17,17 @@ var CacheStorage = inherit(/** @lends CacheStorage.prototype */ {
/**
*
* @name CacheStorage
* @param {String} filename Имя файла, в котором хранится кэш (в формате JSON).
* @param {Object} opts
* @param {String} tmpDir Путь к temp директории
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

opts.tmpDir

};

exports.mkHash = function (path) {
return path.replace(/[\/\\: ]/g, '_');

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

такой вариант не прокатит. для глубоких путей имя файла может получиться длинее 255 символов.
Мы в деньгах перешли на md5 хеш от имени. Может есть варик получше.

@j0tunn j0tunn force-pushed the feature/file.cache branch 2 times, most recently from 5ee1850 to fbc744e Compare July 27, 2016 10:31
@j0tunn
Copy link
Contributor Author

j0tunn commented Aug 16, 2016

🆙

@j0tunn
Copy link
Contributor Author

j0tunn commented Aug 23, 2016

@blond ping

1 similar comment
@j0tunn
Copy link
Contributor Author

j0tunn commented Aug 25, 2016

@blond ping

@j0tunn
Copy link
Contributor Author

j0tunn commented Aug 29, 2016

@blond ping!

@j0tunn j0tunn force-pushed the feature/file.cache branch from 7c75441 to c77c520 Compare September 1, 2016 06:06
@j0tunn
Copy link
Contributor Author

j0tunn commented Sep 1, 2016

@blond Хватит тянуть кота за яйца, давай вливать.

@blond
Copy link
Member

blond commented Sep 1, 2016

Мне не нравится текущее решение. Причины примерно те же, что и раньше. Попробую изложить свои идеи, что не так, и как можно лучше.

А для начала отвечу на вопросы, которые точно прозвучат.

Почему нужно сделать хорошо, это же дополнительная фича?

Работа с файловым кэшом будет доступна через API технологий. Это значит, что API надо продумать сразу и правильно, а не менять его в каждой последующей версии.

Кроме того очень важно, чтобы технологии не могли сломать кэш или мешать другим технологиям. Это самый базовый принцип, который нельзя нарушать. Без него пользоваться ENB и плагинами к нему будет невозможно.

Почему нельзя сказать, что API экспериментальное, а потом воровать и убивать?

Мы хотим использовать файловый кэш в технологиях для ускорения. Технологий много, нас мало. Кроме нас, есть ещё ряд разработчиков, которые пишут свои технологии.

Мне очень не хочется, чтобы разработчики технологий тратили своё время на их переписывание при каждой новой версии ENB.

Мне самому не хочется тратить время на то, чтобы переделывать технологии.

Мне очень не хочется принимать исправления, которые ломают обратную совместимость, или объяснять разработчикам, почему я не буду принимать их «хороший» PR.

Мне очень не хочется, чтобы пользователи технологий страдали от того, что они выбрали технологию, которая использует файловый кэш, при выходе каждой патчевой версии ENB.

Почему nodePrefix не решает всех проблем?

В твоём решении есть опция nodePrefix. Она не спасёт в случае, если несколько технологий будут обрабатывать одинаковые исходные файлы и кэшировать по пути к файлу.

Пример.

На проекте JS разделяют на клиенский browsers.js и серверный node.js, а общую часть выделяют в vanilla.js файлы.

Допустим, что клиенский JS обрабатывают с помощью Babel, а серверный оставляют как есть, но оборачивают в IIFE.

Каждая из технологий будет обрабатывать одни и теже vanilla.js файлы, но по разному. Каждая из них через API будет передавать в key путь к файлу. Происходить это будет асинхронно.

Из-за этого, результаты работы одной технологии могут попасть в собранный файл другой технологии, в рамках одного и того же бандла.

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

Вероятно, один и тот же файл будет передоваться в по разному. Например, всегда относительно бандла (для каждого бандла по разному). Или иногда относительный путь, иногда абсолютный. Из-за не будет эффективного реиспользования.

Кроме минусов, такое API не помогает разработчикам технологий более эффективно реиспользовать файловый кэш.

Другое API

Как я вижу API, которое, решит проблемы с коллизиями и позволит реиспользовать результаты разных таргетов в рамках одной технологии.

cache.putFile(path, content, obj)
  • path— путь к исходному файлу.
  • content — контент файла.
  • obj — составной ключ/дополнительные данные для инвалидации кэша

Путь к исходному файлу всегда перестраивается относительно корня проекта.

Если передать одинаковый путь к файлу, но разные ключи obj, то в файловом кэше они будут записаны в разные файлы.

Помимо obj по умолчанию выставляются дополнительные поля для избежания коллизий. Такими полями могут tech и bundle. Это будет гарантировать, что технологии не испортят ни файловый кэш, ни другие технологии, ни сборку разных бандлов/таргетов.

cache.putFile(path, content, {
    tech: 'js',
    bundle: 'bundle/index'
});

Выставление поля bundle можно отключать опцией. Например, технология может более точечно определить признаки инвалидации кэша.

В случае ошибки, сломаны будут таргеты этой технологии (аналогично ошибке в обычном кэше).

Пример

Технология stylus для разных платформ может использовать разные переменные (опция globals в enb-stylus).

cache.putFile(path, content, {
    globals: globalPaths.join() // прописываем пути к файлам с переменными
});

По аналогии можно прокидывать любые настройки, опции, конфиги, режим сборки и т.д.

> Давай вливать

Надеюсь, я объяснил, почему я не хочу вливать PR в таком виде.

@j0tunn
Copy link
Contributor Author

j0tunn commented Sep 1, 2016

ну ок
будешь делать с этим PR что-то - не забудь про enb/enb-magic-platform#56 и enb/enb-magic-factory#42

@blond
Copy link
Member

blond commented Sep 1, 2016

спасибо

this._data = {};
this._mtime = 0;

this.fileCache = new FileCache(_.pick(opts, 'tmpDir'));

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

лодаш ради ({ tmpDir: opts.tmpDir })?

@JiLiZART
Copy link

Когда же когда

@anton-rudeshko
Copy link

Скорее всего на следующей неделе начнём перепиливать

@JiLiZART
Copy link

Сколько денег надо заплатить и кому, чтобы увидеть эту фичу в проде?

@anton-rudeshko
Copy link

Думаю, за 1 000 000 Блонд сделает. За 10 000 000 сделает наша служба :)

@blond
Copy link
Member

blond commented Nov 30, 2016

@JiLiZART, вообще у меня складывается мнение, что если тебе понадобился файловый кэш, то пора валить с ENB.

А так можешь глянуть на ветку:

https://github.com/enb/enb/tree/feat/file-cache

Я пока не могу найти ему хорошего применения.

@JiLiZART
Copy link

@blond у меня благодаря нему, первый билд 11 секунд, последующие по 200ms. Я им кеширую результаты билда файлов стилей отдельных блоков, и в последующей пересборке, проверяю нужно ли компилировать заново этот блок, или брать из кеша. Я бы рад свалить но не на что )

@tenorok
Copy link

tenorok commented Dec 29, 2016

WHYYYY!!?!?!?

@artra
Copy link

artra commented Mar 17, 2017

@blond а сейчас?

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

Successfully merging this pull request may close these issues.

8 participants