Skip to content

Инструмент для ускорения установки пакетов из распространенных пакетных менеджеров

Notifications You must be signed in to change notification settings

an9eldust/packrat

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

27 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

PackRat

Инструмент для ускорения установки пакетов из распространенных пакетных менеджеров (см. bower / npm).

Зачем это нужно?

Процесс установки пакетов из package.json или bower.json солидного размера занимает болезненно долгое время (речь может идти о нескольких минутах). В век Continuous Integration, когда из одного и того же файла декларации в день могут происходить десятки установок, это очень напрягает. Packrat позволит сократить время второй и последующих до минимального. Но сожрет много места на диске, и эту проблему нужно решать как-то самостоятельно (ниже вариант решения).

Как этим пользоваться?

  1. Нужно убедиться, что вы используете *nix-систему. Если это не так, надеюсь, вы не очень много времени потратили на чтение, увидимся в следующий раз.
  2. Нужно убедиться, что директория /opt/packrat существует, а текущему пользователю хватает прав, чтобы читать из нее и в нее писать (вот подробный ответ про то, как это правильно сделать). Если такой вариант неприемлем, см. секцию про конфиг.
  3. sudo npm install -g packrat@git://github.com/an9eldust/packrat.git
  4. cd %директория_с_package.json_или_bower.json%
  5. packrat npm install / packrat bower install
  6. Следующая установка из этого же package.json или bower.json должна пройти заметно быстрее.

Как это работает?

  1. При установке пакетов packrat проверяет, нет ли в его хранилище (по умолчанию /opt/packrat/%packageManager%/%hash%, настраивается в конфиге) кэша, соответствующего файлу декларации пакетов (package.json / bower.json).
  2. Если в хранилище ничего нет:
    • Производится стандартная установка (командой, взятой опять же из конфига).
    • Директория с только что установленнными пакетами пакуется в архив, который копируется в хранилище.
  3. Если в хранилище лежит архив: packrat решает, что это и есть кэш, и распаковывает его на место локальной директории с пакетами. Естественно, это гораздо быстрее, чем честная установка. Вот для чего мы тут собрались!
  4. Если в хранилище лежит временный файл: это значит, что параллельно идет другая packrat-установка с теми же параметрами из точно такого же файла декларации. Эта установка началась раньше и в конце сложит свои результаты в кэш. Packrat ее ждать не будет и установит пакеты так, как если бы в хранилище ничего не было, но не будет ничего копировать в конце.

Команды и опции (на примере npm)

install

packrat npm install — запускает полный цикл установки npm-пакетов по алгоритму из предыдущего раздела.

packrat npm install --force — перед обычной установкой удалит кэш и локальную node_modules. Может пригодиться, если в вашем package.json есть нестрогие зависимости, и нужно поставить самые свежие версии, которые по этим зависимостям резолвятся. Очевидно, что включение этой опции время не экономит.

packrat npm install --info — выведет в конце установки немного полезной информации.

export

packrat npm export — перекладывает то, что лежит в локальной node_modules, в кэш. Может пригодиться, если вы убеждены, что в кэше лежит что-то неактуальное, а в локальной node_modules, напротив, только что установлен самый свежак. Но нужно учитывать, что эта команда удалит из кэша лог установки и сбросит показатели статистики.

import

packrat npm import — перекладывает то, что лежит в кэше, в локальную node_modules.

clean

packrat npm clean — очищает кэш для текущей конфигурации и текущего package.json (или другого файла, см. конфиг).

info

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'ы бывают такие (см. как это все работает):

  1. READY — кэш готов к использованию
  2. EMPTY — кэша пока нет
  3. PROGRESS — идет параллельная установка, кэш скоро появится

--verbose

packrat npm install --verbose — сделает packrat еще более разговорчивым.

Как это настраивать

По умолчанию packrat использует такой конфиг. Конфиг может быть переопределен файлом .packratrc, имеющим аналогичный формат и лежащим в директории запуска. Ключи на верхнем уровне — пакетные менеджеры, а внутри у них следующие настройки.

storageRoot

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

installCommand

Команда, которой менеджер устанавливает пакеты в обычном режиме. Например, для bower часто актуальна опция --allow-root — здесь самое место для ее размещения.

sourceFile

Имя файла-декларации зависимостей, который должен лежать в той директории, из которой будет запускаться packrat. Если вы используете npm-shrinkwrap.json — с этим сюда.

directory

Имя локальной директории, в которую пакетный менеджер установит зависимости. Ситуацию, когда придется здесь перенастраивать что-то для npm, представить трудно, но для bower это может быть полезно.

Инвалидация кэша

Если дать packrat волю, он довольно быстро сожрет все имеющееся на диске место: ваши зависимости время от времени меняются, но автоматически удалять старые кэши никто не будет. Примерно так find /opt/packrat/ -name 'import.counter' -ctime +7 -exec dirname {} \; (с точностью до реального расположения кэшей) можно найти старый хлам, к которому уже неделю никто не обращался. Добавив в конец команды | xargs rm -rf можно этот хлам удалить, а можно даже выполнять всю команду по крону раз в сутки.

About

Инструмент для ускорения установки пакетов из распространенных пакетных менеджеров

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published