8. Структура пакета NPM

Для того, чтобы посмотреть на реальный «package.json» поставим модуль «express».

Screenshot_08_01

Этим модулем мы ещё будем пользоваться в будущем, а сейчас просто ставим этот внешний модуль и взглянем на его «package.json», как он выглядит

Здесь я позволил себе кратко прокомментировать некоторые строчки этого файла, на самом деле, конечно же, такой «package.json» работать не будет, потому что комментариев  в json не может быть, это делает json не валидным. Мы кратко пройдемся по некоторым особенностям «package.json», пока что в общих чертах, в дальнейшем, когда мы будем делать конкретные вещи, то мы используем это для решения конкретных задач.

Итак поля(в скобочках будет номер строки):
(2) «name»уже знаем
(3) «description» — описание, информационное поле, по нему осуществляется поиск при «npm search».
(4) «version» — версия имеет вид «MAJOR.MINOR.PATCH» и подчиняется спецификации semver. Что это значит? Это означает, что когда я делаю пакет, пока я его еще не опубликовал, или опубликовал, но не в законченном виде,  я делаю первый номер ноль

Это означает, что какие бы(вторая и третья цифры) номера версий  не были, я могу поменять в любой момент, что угодно. Ноль, это не стабильный пакет. Дальше, когда пакет стал стабильным, хотя бы

теперь каждый номер версии имеет конкретный смысл. Здесь последнее значение это патч — PATCH, если я вношу какие то незначительные изменения, скажем bug-fixing

Дальше, средний компонент это минорная версия. Минорная — MINOR версия обновляется при изменениях, которые добавляют новые возможности, но при этом не ломают то, что есть. Таким образом, если человек использует мой модуль, то при выпуске новой версии, например

он может обновиться и его текущий код не должен сломаться.
И наконец мажорная — MAJOR версия. Если я внес хоть какое то, минимальное изменение, которое ломает существующий код, например поменял порядок аргументов у функции, то я обязан изменить MAJOR версию

Вот такая, достаточно простая схема нумерации версий, у нее есть еще ряд нюансов и если захотите с ними подробней ознакомиться — http://semver.org/lang/ru/ Семантическое версионирование, используется повсеместно в Node.JS и не только.
Для его, чтобы поставить конкретную версию используют вот такой синтаксис

Например 3.0 — это последняя версия ветки 3.0 например 3.0.15. Могу просто указать 3 — тогда это последняя версия этой ветки, если последняя была 3.8.6, то поставила бы ее. Обычно старую версию ставят либо из соображений совместимости, либо потому что у более новой какие то ошибки.

Иногда возникает другая задача, необходимо поставить самую, самую последнюю версию модуля, которая еще не была опубликована.  Например, потому что в ней были исправлены важные ошибки или добавлены какие то возможности. Это очень просто, если модуль разрабатывается используя систему версионирования «Git». Например на GitHub. Достаточно получить Git Read-Only url

Screenshot_08_02

скопировать его и в консоли набираем

получаем

Screenshot_08_03

Эффект то же. Еще один вариант, это прямо скачать архив с модулем и дать его аргументом в «npm i …» более подробно про «npm install» можно посмотреть в хелпе —

Screenshot_08_04

Откроется документация в браузере

Screenshot_08_05

как видите, перед нами список всего, что может получать эта команда. То есть «npm install» очень гибкая штука, она может ставить модуль от куда  угодно.

следующие поля информационные, это
(6)  «author» — про автора
(10) «contributors» — про тех кто принимал участие
(40) «license» — понятно,
(41) «repository» — это репозиторий где находятся исходники модуля, информационное поле, никакой существенной роли не играет
(45) «homepage» — говорит само за себя
(46) «keywords» — ключевые слова — информационное поле, которое используется «npm search» при поиске.

(57) «dependencies» — уже структурное поле, оно указывает те модули от которых зависит данный. Если мы обратим внимание на консоль, то там, когда ставился «express», выдало вот такой список

Screenshot_08_06

Это подмодули. Каждый модуль из этого списка будет ставиться в поддиректорию «node_modules». То есть видите, я поставил «express» в папку с проектом, и «NPM» сам создал себе папку «node_modules» куда и поставил «express». Внутри же папки «express» есть своя папка «node_modules» где и находятся подмодули «express».

Screenshot_08_07

Это очень классное свойство «NPM».

Свойство «dependencies», можно использовать, так  же для упрощения установки модуля. Например я  написал модуль и я хочу его кому нибудь передать. Не обязательно при помощи репозитория, или я его куда нибудь скопировал, я не обязан таскать за собой большую директорию «node_modules», я просто сделаю

и дальше, кто угодно, кто получил директорию с «package.json» может зайти в консоль и набрать команду «npm i»

Screenshot_08_08

Как видите, «NPM» сначала выругался на мой «package.json», в связи с недостатком описания, но потом, все же, поставил «express» в директорию «node_modules», причем «express» именно версии 3.

Screenshot_08_09

Кроме «dependencies» есть еще «devDependencies»
(85) «devDependencies» — они не ставятся, если модуль подтягивается как зависимость. Иначе говоря, в той инсталляции которую я только что сделал, через «npm install» в «express» поставились только «dependencies». Модули «devDependencies», предполагается, что нужны для разработки и они будут ставиться в двух случаях. Первое — если стоит специальный флаг конфига, команда есть такая «npm config». И второе, если я зайду непосредственно в директорию «express» и уже в директории из консоли наберу «npm install»

Screenshot_08_10

(114) «scripts» — позволяет задавать команды которые автоматически выполняются при некоторых действиях с пакетом. Со списком таких команд можно ознакомиться введя в консоли «npm help scripts».

Так же бывает поле «main» — оно задает точку входа в пакет. Обычно, когда мы подключаем какой то модуль, например «require(«express»)», то подключается файл «index.js» в этой директории. Заданием поля «name» это можно поменять, например

В таком случае при подключении «require(«express»)» будет подключаться не «index.js» которого может и не быть, а данный файл «application.js».

Ну и многие другие поля с которыми можно ознакомится в документации по «package.json» или, введя в консоли «npm help json», все в той же документации.