07Sep

868d4746549e43a4966d9bffb8677889

Эта статья посвящена 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:

http://registry.npmjs.org/

в которой содержится meta информация про модули. То есть, например, я захожу в supermodule:

http://registry.npmjs.org/supermodule

и здесь, как вы видите, содержится вся информация о модуле, информация из его  package.json и ссылка на файл с модулем.
Этот файл тоже находится в базе. Он был загружен туда автоматически в процессе выполнения команды npm publish. Обращаю внимание, все, что загружено в этот registry, является открытым для всех.

Ну, а что, если мы работаем в компании, которая не может все публиковать открыто? И при этом, мы хотим использовать NPM для того, чтобы внутри компании было удобно работать с пакетами. Для этого мы можем поднять свой собственный корпоративный NPM репозитарий и уже работать с ним. NPM настраивается достаточно просто. Если вас это заинтересует, то здесь есть инструкции по тому, что и как ставить:

https://github.com/npm/npm-registry-couchapp

Либо альтернативный вариант – можно воспользоваться платным сервисом NPM, который представляет закрытый репозитарий для компаний:

https://www.npmjs.com/pricing

На этом мы заканчиваем всеобщую информацию по NPM. Дальше мы будем более глубоко изучать package.json и пользоваться модулями из этого хранилища.

coding-wombat1
Материал урока взят из следующего скринкаста

We are looking forward to meeting you on our website soshace.com