Эта статья посвящена NPM – менеджеру пакетов для Node.JS. Модуль NPM идет вместе со стандартной инсталляцией Node. Если вы поставили Node, то NPM вы поставили тоже. В этом модуле, кроме всего прочего, содержится консольная утилита, которая дает удобный доступ к громадной базе данных модулей, поддерживаемых сообществом. Как правило, если есть стандартная программистская задача, то модуль для ее решения скорее всего можно найти здесь. Это первое, что надо сделать – поискать готовый модуль.
Сейчас нашей задачей будет понять, что же это такое эти самые пакеты, с которыми работают NPM. Для этого мы сейчас познакомимся с программистом, которого зовут Райан . Он сидит за своим компьютером и только что создал замечательный модуль, назвал его supermodule.
module.exports = function() { console.log("This module - is the best module on Earth"); console.log("It helps to draw with chalk on the wall"); };
Райан захотел поделиться этим модулем с другими людьми, конечно же, используя NPM. Для этого Райану недостаточно просто создать директорию с модулем, нужно еще создать специальный файл описания пакета с названием package.json. Этот файл содержит самую главную информацию о том, что за пакет здесь находится. Как правило, имя модуля совпадает с названием директории и версия здесь самая, что не есть первая. Если Райан достаточно ленив, то он может не создавать package.json руками, а воспользоваться вызовом
npm init
в консоли. Он спросит основные характеристики пакета: name, version и т.д. и сгенерирует package.json.
Основные поля: name, version , дополнительные мы рассмотрим потом.
{ "name": "supermodule", "version": "0.0.1", "description": "ERROR: No README data found! ", "main": "index.js", "scripts": { "test": "echo\"Error: no test specified\"&& exit 1" }, "repository": "", "author": "", "license": "BSD" }
Итак, теперь package.json готов и можно опубликовать модуль в центральной базе данных. Для этого существует команда:
npm publish
Если сейчас ее вызвать, то будет ошибка. Потому что, чтоб ее опубликовать, нужен user. Поэтому Райан набирает
npm adduser
и создает user. NPM отправляет соответствующие запросы и создает его. Теперь вся работа с NPM будет от имени этого user. Это имеет значение, только если Райан работает на изменение в центральной базе данных. Для установки модуля это не нужно, а вот для публикации как раз очень важно.
Npm publish
Делает запрос к базе данных и отправляет туда модуль Райана .Модуль создан. Теперь кто угодно может его поставить, ну а Райан, если он залогинен, может вносить в него изменения.
Для того, чтобы посмотреть команды NPM, можно брать
npm help:
Здесь достаточно много команд. Мы использовали:
adduser
publish
Кроме того, есть команда:
unpublish
Она удаляет модуль, и ряд других команд.
А в это время где-то далеко-далеко сидит Линус. Он пишет проект. И в этом проекте ему нужен модуль, который должен быть просто супер. Линус хочет его найти в базе данных NPM и пишет:
npm search
или
npm s supermodule
Npm s подтягивает изменения базы данных в локальный cache и потом делает поиск. В данном случае в качестве supermodule много всего нашлось и, конечно, нашелся модуль Райана . Почему-то Линус хочет поставить именно его. Он пишет:
npm install
или
npm i supermodule
NPM скачивает модуль из базы данных и ставит его. Куда? В директорию node_modules. Появилась эта директория, и в ней находится supermodule от Райана . Теперь Линус уже может сделать require внутри своего проекта подключив его:
var supermodule = require(‘supermodule’);
supermodule();
Запускаем. Отлично, работает!
Обратим внимание на небольшую тонкость, связанную с местом установки модуля. Вернемся в консоль и тут в конце npm i написано, куда поставился модуль. Например, Линус сделал директорию db:
mkdir db
и перешел в эту директорию:
cd db
затем вводим:
ls
Захотел он поставить в ней какой-то модуль. Он нажимает :
npm install supermodule
Обратите внимание, что модуль поставился вовсе не в текущую директорию. То есть, директория db как была пустой, так и осталась. Модуль поставился чуть выше, в директорию ../node_modules/supermodule, где он, собственно, уже и был. Почему так произошло? Очень просто. Когда NPM ищет место для установки пакета, то она сначала ищет специальную папку node_modules в текущей директории, потом выше, потом еще выше и т.д. То есть, она идет вверх по иерархии в поисках node_modules. Если она найдет эту директорию, та установит в нее либо она ищет файл package.json. Если найдет, то сделает node_modules там. И только если ни node_modules, ни package.json выше не найдено, то оно делает node_modules в текущей директории. Смысл всей этой затеи в том, что в какую бы директорию я не запустил npm install, она будет подниматься выше пока не найдет корень проекта, обозначаемого либо package.json файлом, либо node_modules. Именно в этот корень проекта оно будет ставиться. И, как правило, это поведение и есть то, которое наиболее желательно. А что, если я все-таки хочу поставить модуль именно в db и никуда еще? Очень просто. Достаточно создать директорию node_modules руками в нужной вам папке. Теперь, если в db набрать npm install, то оно найдет node_modules сразу и поставит его именно сюда, и не пойдет искать выше.
Со временем Райан выпустит новый модуль. Для того, чтобы Линусу обновить этот модуль из депозитария, достаточно набрать команду:
npm up
Npm up проверит новые модули, которые есть в node_modules. В данном случае только один модуль – supermodule. Оно проверило и никакого обновления не увидело. Ну, а если бы увидело, то обновило бы до нужной версии.
Наконец, если Линусу надоело использовать supermodule, то он может либо удалить его из node_modules руками, либо он может набрать команду:
npm remove
или
npm r supermodule
Итак, мы рассмотрели основной жизненный цикл пакета NPM:
- он начинается с команды npm init, который создает package.json.
- Затем вызывается npm adduser и npm publish, который публикует этот пакет в центральной базе данных, которую также называют репозитарием;
- И теперь тот, кто хочет поставить этот пакет, может при помощи npm search искать его.
Обратите внимание, полностью слова необязательно набирать. То есть, можно просто набрать npm s.
- Наконец, npm install поставит модуль по названию;
- npm update обновит его и npm remove удалит. Если npm update вызвать без модуля, она обновит все модули, которые есть;
- npm help , позволяет получать встроенный help npm. Иногда там есть достаточно интересные вещи, например, если набрать npm help search, то тут есть такая штука, что можно искать не просто по ключевым словам, а по регулярным выражениям.
И, наконец, небольшое дополнение по базе данных, по репозитарию. Центральный репозитарий, как вы видели в url, в примерах, это база данных в системе CouchDB:
в которой содержится meta информация про модули. То есть, например, я захожу в supermodule:
http://registry.npmjs.org/supermodule
и здесь, как вы видите, содержится вся информация о модуле, информация из его package.json и ссылка на файл с модулем.
Этот файл тоже находится в базе. Он был загружен туда автоматически в процессе выполнения команды npm publish. Обращаю внимание, все, что загружено в этот registry, является открытым для всех.
Ну, а что, если мы работаем в компании, которая не может все публиковать открыто? И при этом, мы хотим использовать NPM для того, чтобы внутри компании было удобно работать с пакетами. Для этого мы можем поднять свой собственный корпоративный NPM репозитарий и уже работать с ним. NPM настраивается достаточно просто. Если вас это заинтересует, то здесь есть инструкции по тому, что и как ставить:
https://github.com/npm/npm-registry-couchapp
Либо альтернативный вариант – можно воспользоваться платным сервисом NPM, который представляет закрытый репозитарий для компаний:
На этом мы заканчиваем всеобщую информацию по NPM. Дальше мы будем более глубоко изучать package.json и пользоваться модулями из этого хранилища.
Материал урока взят из следующего скринкаста
We are looking forward to meeting you on our website soshace.com