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

Доклад. Agile (вводная часть). Scrum

Гибкая методология разработки (Agile) описывает набор принципов для разработки программного обеспечения в соответствии с которым требования и решения развиваются за счет совместных усилий самоорганизующихся кросс-функциональных команд.

Уроки React. Урок 11. Pt.1.

На предыдущем уроке мы научились более удобным способом писать reducers используя удобные API для добавления/удаления элементов, не беспокоясь о том, что мы что-то изменим по дороге.

Теперь если мы с Вами посмотрим на наше приложение и откроем какую-нибудь статью, то увидим в console warnning. Наши propTypes предупреждают нас о наличии проблемы, еще до того момента как мы до нее доберемся. Это огромный плюс – то что мы их написали. О чем говорит этот warnning ?