Инструмент для ускорения установки пакетов из распространенных пакетных менеджеров (см. bower / npm).
Процесс установки пакетов из package.json
или bower.json
солидного размера занимает болезненно долгое время (речь может идти о нескольких минутах).
В век Continuous Integration, когда из одного и того же файла декларации в день могут происходить десятки установок, это очень напрягает.
Packrat позволит сократить время второй и последующих до минимального.
Но сожрет много места на диске, и эту проблему нужно решать как-то самостоятельно (ниже вариант решения).
- Нужно убедиться, что вы используете *nix-систему. Если это не так, надеюсь, вы не очень много времени потратили на чтение, увидимся в следующий раз.
- Нужно убедиться, что директория
/opt/packrat
существует, а текущему пользователю хватает прав, чтобы читать из нее и в нее писать (вот подробный ответ про то, как это правильно сделать). Если такой вариант неприемлем, см. секцию про конфиг. sudo npm install -g packrat@git://github.com/an9eldust/packrat.git
cd %директория_с_package.json_или_bower.json%
packrat npm install
/packrat bower install
- Следующая установка из этого же
package.json
илиbower.json
должна пройти заметно быстрее.
- При установке пакетов
packrat
проверяет, нет ли в его хранилище (по умолчанию/opt/packrat/%packageManager%/%hash%
, настраивается в конфиге) кэша, соответствующего файлу декларации пакетов (package.json
/bower.json
). - Если в хранилище ничего нет:
- Производится стандартная установка (командой, взятой опять же из конфига).
- Директория с только что установленнными пакетами пакуется в архив, который копируется в хранилище.
- Если в хранилище лежит архив: packrat решает, что это и есть кэш, и распаковывает его на место локальной директории с пакетами. Естественно, это гораздо быстрее, чем честная установка. Вот для чего мы тут собрались!
- Если в хранилище лежит временный файл: это значит, что параллельно идет другая packrat-установка с теми же параметрами из точно такого же файла декларации. Эта установка началась раньше и в конце сложит свои результаты в кэш. Packrat ее ждать не будет и установит пакеты так, как если бы в хранилище ничего не было, но не будет ничего копировать в конце.
packrat npm install
— запускает полный цикл установки npm-пакетов по алгоритму из предыдущего раздела.
packrat npm install --force
— перед обычной установкой удалит кэш и локальную node_modules
. Может пригодиться, если в вашем package.json
есть нестрогие зависимости, и нужно поставить самые свежие версии, которые по этим зависимостям резолвятся.
Очевидно, что включение этой опции время не экономит.
packrat npm install --info
— выведет в конце установки немного полезной информации.
packrat npm export
— перекладывает то, что лежит в локальной node_modules
, в кэш.
Может пригодиться, если вы убеждены, что в кэше лежит что-то неактуальное, а в локальной node_modules
, напротив, только что установлен самый свежак.
Но нужно учитывать, что эта команда удалит из кэша лог установки и сбросит показатели статистики.
packrat npm import
— перекладывает то, что лежит в кэше, в локальную node_modules
.
packrat npm clean
— очищает кэш для текущей конфигурации и текущего package.json
(или другого файла, см. конфиг).
packrat npm info
— выдает немного информации по текущей конфигурации. Вроде такой:
Storage path: /opt/packrat/npm/bb6f3f75d393d8ad428b5e41d483ccf4
Storage status: READY
Installation time: 57 sec
Times storage was imported: 5
Mean import time: 1 sec
Mean shaved time: 4 min, 39 sec
Install command: `npm install`
Local packages directory: node_modules
Package declaration file: package.json
Можно только порадоваться своей экономичности.
Storage status
'ы бывают такие (см. как это все работает):
READY
— кэш готов к использованиюEMPTY
— кэша пока нетPROGRESS
— идет параллельная установка, кэш скоро появится
packrat npm install --verbose
— сделает packrat еще более разговорчивым.
По умолчанию packrat использует такой конфиг.
Конфиг может быть переопределен файлом .packratrc
, имеющим аналогичный формат и лежащим в директории запуска.
Ключи на верхнем уровне — пакетные менеджеры, а внутри у них следующие настройки.
Путь на файловой системе к корню хранилища для этого менеджера.
Команда, которой менеджер устанавливает пакеты в обычном режиме. Например, для bower
часто актуальна опция --allow-root
— здесь самое место для ее размещения.
Имя файла-декларации зависимостей, который должен лежать в той директории, из которой будет запускаться packrat. Если вы используете npm-shrinkwrap.json
— с этим сюда.
Имя локальной директории, в которую пакетный менеджер установит зависимости. Ситуацию, когда придется здесь перенастраивать что-то для npm
, представить трудно, но для bower
это может быть полезно.
Если дать packrat волю, он довольно быстро сожрет все имеющееся на диске место: ваши зависимости время от времени меняются, но автоматически удалять старые кэши никто не будет.
Примерно так find /opt/packrat/ -name 'import.counter' -ctime +7 -exec dirname {} \;
(с точностью до реального расположения кэшей) можно найти старый хлам, к которому уже неделю никто не обращался.
Добавив в конец команды | xargs rm -rf
можно этот хлам удалить, а можно даже выполнять всю команду по крону раз в сутки.