Использование npm для управления пакетами Node.js на сервере Linux
Linux, VPS | Комментировать запись
Node.js – это платформа Javascript для серверного программирования, которая позволяет быстро разрабатывать и запускать сетевые приложения. В предыдущем руководстве речь шла об установке Node.js на Ubuntu 14.04.
Данное руководство посвящено npm, системе управления пакетами Node.js. Эта утилита позволяет легко определять зависимости, искать пакеты и управлять инсталляциями.
Предполагается, что Node.js и npm уже установлены на сервер. Следуйте инструкциям вышеупомянутого руководства, чтобы установить Node.js на Ubuntu 14.04 (рекомендуется сделать это при помощи nvm).
Для быстрого старта найдите нужные пакеты в репозитории Ubuntu 14.04 и установите их:
sudo apt-get update
sudo apt-get install nodejs npm
Функции npm
Первое, что нужно сделать – это добавить некоторые функции автозаполнения npm; для этого внесите в конец конфигурационного файла оболочки некоторую информацию.
Наберите:
npm completion >> ~/.bashrc
Теперь выполните команду source на конфигурационный файл, чтобы он перечитал только что внесенные изменения:
source ~/.bashrc
Теперь при нажатии клавиши TAB npm должен автоматически завешать команды.
Кроме того, npm обладает очень полезной функцией help. Чтобы получить представление о подкомандах, которые доступны в npm, введите
npm help
Usage: npm <command>
where <command> is one of:
add-user, adduser, apihelp, author, bin, bugs, c, cache,
completion, config, ddp, dedupe, deprecate, docs, edit,
explore, faq, find, find-dupes, get, help, help-search,
. . .
Чтобы получить краткое описание данных подкоманд, наберите:
npm -l
Usage: npm <command>
where <command> is one of:
adduser npm adduser
Then enter stuff at the prompts
bin npm bin
npm bin -g
(just prints the bin folder)
. . .
Можно получить намного более обширный обзор каждой из этих команд, набрав:
npm help subcommand
Это выведет отдельную страницу руководства, посвященную необходимой подкоманде.
Чтобы узнать, какая команда выполняет то или иное действие, можно выполнить поиск по разделам справки:
npm help-search необходимый_термин
Поиск информации о системе
Узнав, как получить доступ ко встроенной справке, попробуйте запросить связанную с npm информацию о системе.
Но прежде нужно выяснить, какова разница между локальными и глобальными пакетами.
Локальные vs глобальные пакеты
При разработке приложения Node.js можно создать структуру каталогов для хранения приложения. В каталоге проекта будет подкаталог node_modules, содержащий все модули, которые можно установить локально.
Для примера создайте пустую структуру каталогов:
mkdir -p ~/projects/test_package/node_modules
cd ~/projects/test_package
Модули, установленные локально, могут быть использованы внутри проекта с помощью функции require().
Чтобы иметь возможность использовать командную строку пакета, его нужно установить глобально. Приложения, установленные глобально, хранятся в каталоге ~/.npm/. Функции их командной строки будут доступны всем приложениям Node.js, но такие пакеты нельзя использовать при помощи require().
Зная это, можно перейти к использованию особенных функций каждого конкретного вида пакетов. По умолчанию большинство команд npm предполагает, что речь идет о локальных пакетах; чтобы обратиться к глобальному пакету, используйте флаги -g или –global.
Список установленных пакетов
Итак, чтобы получить список (локальных) пакетов Node.js, которые доступны в каталоге test_package, наберите:
npm ls
/home/demouser/projects/test_package
└── (empty)
Поскольку такие пакеты не были установлены, каталог пуст.
Тем не менее, npm автоматически устанавливает некоторые глобальные пакеты. Чтобы просмотреть их список, внесите флаг -g:
npm ls -g
/home/demouser/.nvm/v0.11.13/lib
└── npm@1.4.9
├── abbrev@1.0.4
├── ansi@0.2.1
├── ansicolors@0.3.2
├── ansistyles@0.1.3
├── archy@0.0.2
. . .
Как видите, глобальных пакетов достаточно много и они показаны в формате дерева зависимостей.
Существует еще несколько функций для изменения вывода. Для получения дополнительной информации используйте флаги -l или -a. Чтобы просмотреть эту информацию в JSON, используйте флаг –json.
Запросы другой информации
Помимо сведений об установленных пакетах, npm может предоставлять некоторую другую информацию о его среде.
Чтобы узнать, какой из каталогов npm называет root-каталогом модуля в локальной иерархии пакетов, наберите:
npm root
/home/demouser/projects/test_package/node_modules
Чтобы получить путь верхнего уровня к используемому пакету, введите субкоманду prefix:
npm prefix
/home/demouser/projects/test_package
Ее также можно использовать с флагом -g, чтобы узнать, где хранятся глобальные файлы.
Чтобы увидеть, куда npm устанавливает исполняемые файлы, найдите каталог bin текущего проекта:
npm bin
/home/demouser/projects/test_package/node_modules/.bin
Изучение файлов пакета
Чтобы быстро перейти в каталог, в котором установлен пакет, можно просто использовать субкоманду explore. Это откроет в каталоге подоболочку, в которой установлен пакет.
К примеру, можно открыть подоболочку в каталоге, где установлен npm, набрав:
npm explore -g npm
Exploring /home/demouser/.nvm/v0.11.13/lib/node_modules/npm
Type 'exit' or ^D when finished
Можно управлять файлами в этом каталоге или просто просмотреть их, а затем выйти из подоболочки и вернуться к предыдущим задачам.
exit
npm как менеджер пакетов
Данное руководство охватило уже достаточно много возможностей npm; тем не менее, основные его функции – возможности управления пакетами – до сих пор не затронуты.
Поиск и установка пакетов
Необходимые пакеты Node.js можно найти с помощью npm. К примеру, для проекта нужен пакет express (веб-фреймворк).
Его можно поискать в архиве пакетов npm, расположенных на сайте npm:
npm search express
Это выведет достаточно объемный список, поскольку пакет express достаточно популярен. Чтобы результат стал более удобочитаемым, можно передать его в пейджер (например, less). Также можно использовать регулярные выражения (с некоторыми сложными символами с целью избежать интерпретаторов оболочки), например:
npm search /^express\[\ \]
NAME DESCRIPTION AUTHOR DATE VERSIO
express Sinatra inspired web development framework =tjholowaychuk… 2014-05-12 4.2.0
Если результат снова содержит много названий, возможно, проще посетить сайт npm и узнать точное название пакета.
Узнав название пакета, можно перейти к его установке. Данный пакет нужно установить глобально, чтобы иметь доступ к командной строке.
npm install -g express
Это скачает и установит пакет express и все его зависимости в глобальный root-каталог npm.
Чтобы установить данный пакет в локальный каталог модуля приложения и получить доступ к конструкции require(), наберите:
cd ~/projects/test_package
npm install express
В целом, устанавливать пакет и зависимости в оба каталога нет необходимости – этого можно избежать, и ниже будет показано, как именно.
Удаление, дедупликация, обрезка и связывание пакетов
Поскольку проекту нужны и командная строка, и функция require(), нужно сделать так, чтоб он был доступен в глобальном и локальном каталогах.
Для начала нужно удалить локальную версию пакета:
npm uninstall express
Теперь сообщите npm о необходимости связать глобальную копию с локальным пакетом:
npm link express
Это создаст символическую ссылку на глобальный пакет внутри каталога node_modules, благодаря чему пакет станет доступен в обоих каталогах.
Можно было бы, наоборот, удалить глобальную версию, а затем перейти в локальный каталог и создать ссылку из него. Это делается следующим образом:
- для начала удалите локальную ссылку и глобальный пакет:
npm uninstall express # Чтобы удалить символическую ссылку
npm uninstall -g express # Чтобы удалить глобальный пакет
- снова установите пакет (теперь как локальный):
npm install express
- теперь пакет находится в локальном каталоге приложения (~/projects/test_package/node_modules), но не доступен глобально. Чтобы создать глобальную ссылку на пакет, нужно открыть его каталог и вызвать субкоманду link без дополнительных аргументов.
cd ~/projects/test_package/node_modules/express
npm link
С помощью этой же процедуры можно сделать пакет test_package доступным для других созданных пакетов (если он имеет правильную структуру каталогов).
Устанавливая и перемещая пакеты, можно воспользоваться функцией dedupe.
Как известно, пакеты имеют ряд зависимостей, которые устанавливаются иерархически. Тем не менее, некоторые пакеты могут делиться зависимостями. То есть, если каталог пакета содержит два модуля, каждый из которых зависит от пакета abcd, то последний будет установлен дважды: один раз как package1/node_modules/abcd, второй – как package2/node_modules/abcd.
Подкоманда dedupe отслеживает подобные случаи и перемещает общие зависимости на следующий уровень, где оба пакета смогут найти единственную установку этой зависимости.
К примеру, можно попробовать дедуплицировать зависимости пакетов в каталоге приложения express. Это можно сделать следующим образом:
cd ~/projects/test_package/node_modules/express
npm dedupe
Это действие найдет два пакета (mime и debug). Модуль debug также является зависимостью другого модуля express под названием send. Как правило, такой пакет дедуплицируется, но в этом случае произошел конфликт версий, поэтому ничего не случилось.
Предположим, пакет был дедуплицирован, что перемещает некоторые зависимости на уровень выше; затем пакеты, которым ранее принадлежал пакет зависимости, были удалены. В таком случае зависимость не будет удалена, потому что она больше не входит в подкаталоги данных пакетов.
В подобных ситуациях npm может отсечь (prune) ненужные системе пакеты (то есть, пакеты, которые не внесены в список зависимостей “материнского” пакета).
Чтобы удалить ненужные зависимости, вызовите:
npm prune
Поиск устаревших пакетов и их обновление
Чтобы узнать, какие из пакетов устарели, наберите:
npm outdated
. . .
Package Current Wanted Latest Location
type-is 1.1.0 1.1.0 1.2.0 express > type-is
debug 0.8.0 0.8.0 0.8.1 express > send > debug
Это выведет список пакетов, которые необходимо заменить более новыми версиями. Появится схема, показывающая, какие из необходимых пакетов установлены и отличаются ли их версии от последних доступных.
Чтобы обновить пакеты, нужно отредактировать версию, запрашиваемую в файле пакета package.json, а затем выполнить команду update:
npm update
Итоги
Руководство знакомит с наиболее общими способами работы с менеджером пакетов npm.
Следующая статья рассматривает, как настроить npm, изменить его поведение, как создавать пакеты с помощью npm, публиковать их и взаимодействовать с веб-сайтом npm.
Tags: Javascript, Linux, Node.js, npm, NVM, Ubuntu, Ubuntu 14.04, VPS