Утилита sloc, которую мы использовали в прошлом уроке, создана обычным программистом как пакет NPM. Каким образом она стала доступна для установки? Дело в том, что недостаточно просто создать пакет и залить (git push) его код на гитхаб. Так NPM ничего о нем не узнает. При установке неизвестного пакета NPM выдаст соответствующее предупреждение:

$ npm install unkownpackagename
npm ERR! code E404
npm ERR! 404 Not Found: [email protected]

Утилита npm не смогла найти пакет в своем хранилище пакетов, о чем радостно нам и сообщила. Разберемся с добавлением нашего пакета в хранилище NPM.

Если мы хотим дать разработчикам возможность использовать наш пакет, то необходимо выполнить его публикацию. Публикация пакета сводится к запуску команды npm publish в корне нашего проекта:

# Ниже показан процесс публикации пакета из репозитория https://github.com/hexlet-boilerplates/nodejs-package
$ cd nodejs-package
$ npm publish

> [email protected] prepublishOnly .
> npm run build


> [email protected] build /Users/mokevnin/projects/nodejs-package
> NODE_ENV=production babel src --out-dir dist --source-maps inline

src/bin/hexlet.js -> dist/bin/hexlet.js
src/half.js -> dist/half.js
src/index.js -> dist/index.js
+ [email protected]

Вывод может быть довольно большим. Главное, что здесь не видно явных ошибок и в конце такая строчка: + [email protected]. Она сигнализирует о том, что пакет с именем nodejs-package был добавлен в NPM хранилище под версией 0.0.2. Как только публикация пройдет, ваш пакет автоматически станет доступным для установки. Убедиться в этом можно следующим образом:

$ sudo npm install -g nodejs-package
Password:
npm WARN deprecated [email protected]: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue
npm WARN deprecated [email protected]: Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue
npm WARN deprecated [email protected]: graceful-fs v3.0.0 and before will fail on node releases >= v7.0. Please update to [email protected]^4.0.0 as soon as possible. Use 'npm ls graceful-fs' to find it in the tree.
/usr/local/bin/hexlet -> /usr/local/lib/node_modules/nodejs-package/dist/bin/hexlet.js
+ [email protected]
added 187 packages in 16.11s

Как видите, в конце снова появляется строчка + [email protected], но теперь она означает что пакет nodejs-package версии 0.0.2 был установлен.

И для полноты картины еще два способа найти нужный пакет и убедиться что он есть в NPM хранилище:

  1. Поискать на сайте https://www.npmjs.com/
  2. Выполнить команду npm info nodejs-package. Если вы увидите информацию о пакете, то все хорошо. В противном случае возникнет ошибка.

Для успешной публикации должны выполниться два условия:

  • Имя пакета уникально. Если оно не уникально, то пакет опубликован не будет, что и понятно, ведь тогда станет невозможным разобраться чей ставить пакет при указании этого имени.
  • Вы зарегистрированы на сайте https://www.npmjs.com/ и выполнили локально аутентификацию, запустив в командной строке npm login (синоним команды npm adduser). Такое требование важно с точки зрения безопасности. Пакет может публиковать только зарегистрированный пользователь, а обновлять — автор пакета.
  • В случае обновления, версия нового пакета должна быть выше версии текущего опубликованного пакета. Далее подробно об этом пункте

Версионирование

В разработке, принято версионировать программное обеспечение. Версия это номер либо группа номеров (иногда с буквами или словами), которая обозначает какой-то конкретный этап разработки данного кода. Вот некоторые примеры: 0.0.2, 1.0.32, 1.33. С конкретной версией кода всегда связаны какие-то изменения относительно предыдущей версии, например новые фичи, исправления багов или улучшения, такие как повышение производительности.

Зачем нужны версии в библиотеках? В первую очередь из-за обратной совместимости. Жизнь течет, все меняется и со временем библиотеки начинают работать по другому, используют более удобные и современные подходы. В свою очередь код который их использует, не меняется одновременно с ними, а значит мы не можем гарантировать того, что наш код заработает с другой, более новой версией библиотеки. Поэтому нужна возможность фиксировать версию до тех пор пока наш код не будет готов к использованию новой. Подробнее поговорим об этом в уроке про зависимости.

Современное версионирование кода основано на универсальном стандарте, который называется SEMVER (семантическое версионирование). По стандарту, версия представляет из себя три числа разделенных точками: 1.23.5. Каждое из этих чисел имеет собственно имя и предназначение:

  • Первое число (1 в примере выше) — Мажорная версия. Меняется только в случае серьезных изменений, как правило, ломающих обратную совместимость
  • Второе число (23 в примере выше) — Минорная версия. Не должна ломать обратную совместимость (в идеале). Меняется при добавлении новых возможностей.
  • Третье число (5). Патч. Гарантировано не должна менять обратную совместимость (к сожалению такое бывает). Меняется только при исправлении багов.

К сожалению, соответствие требованиям, целиком и полностью ответственность разработчиков. Автоматическая проверка (верификация) невозможна. Поэтому бывают сбои, когда версионирование происходит неверно, но, в целом, такой подход работает и упрощает работу.

Обратите внимание на то что версия 1.12.3 выше чем версия 1.3.3, потому что 12 больше чем 3.

Самостоятельная работа

  • Зарегистрируйтесь на сайте https://www.npmjs.com/ (это пригодится для участия в проектах).

Дополнительные материалы

  1. Создание и публикация пакета