Использование npm для управления пакетами Node.js на сервере Linux

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: , , , , , , ,

Добавить комментарий