Pull to refresh

Система пакетов в Meteor

Reading time5 min
Views4.8K
Начиная с версии 0.9.0 (примерно пару месяцев назад) в Meteor обновилась система пакетов, созданная на основе Atmosphere. С выходом новой системы пакетов, каждому пользователю стали доступны создание и публикация собственных пакетов. По состоянию на текущий момент в системе более 1800 пакетов и насчитывается около 500 контрибьюторов.

Про сам Meteor, Meteorite и Atmosphere уже неоднократно писали на хабре, я же хочу поделиться опытом именно в создании пакетов для этого фреймворка.

Эта статья о том, зачем нужна очередная система пакетов, как ей пользоваться, как создавать, тестировать и публиковать пакеты.

Основные возможности системы пакетов


  • Добавление, обновление и удаление пакетов, используемых в проекте, из командной строки;
  • Вывод списка установленных пакетов;
  • Кеширование пакетов — нет необходимости каждый раз загружать одинаковые пакеты для различных проектов;
  • Поиск пакетов по удаленному хранилищу, также поиск может осуществляться по закешированным пакетам;
  • Версионирование согласно спецификации Semantic Versioning и управление версиями пакетов;


Зачем нам еще одна система дистрибуции пакетов?


Сейчас есть как минимум две системы пакетов, про которые, наверное, слышал каждый веб-разработчик: npm и bower для клиентских библиотек. В каждой из них насчитывается тысячи пакетов, а в npm еще и ежедневных загрузок по несколько миллионов. Так почему бы не использовать эти системы для доставки библиотек в приложения на Meteor?

Как утверждают сами авторы[2] новой системы, основной причиной является возможность запуска js кода на различных платформах: в браузере, на сервере или телефоне — то есть сейчас вы можете написать свой код на js один раз и запустить его в любом месте, но с этим могут возникнуть некоторые проблемы.

Разработчики приводят следующий пример: допустим, вы хотите создать сервис который будет работать с данными от стороннего сервиса при помощи REST API, например от социальной сети Facebook. На клиенте вам потребуется воспользоваться функционалом XMLHttpRequest, на сервере модулем для NodeJS http, либо различными надстройками. Вы пишете код в обоих случаях на js, но он получается не портируемым, в следствие чего вам необходимо поддерживать две различные версии.

Идея Meteor состоит в том, что с помощью стандартного пакета HTTP вы можете написать изоморфный код, который одинаково будет работать как на клиенте так и на сервере. Поддержка подобной изоморфности в Meteor распространяется даже на пакеты для работы с базой данных.

В Meteor система сборки пакетов позволяет указать код, который будет выполняться на конкретной платформе или на нескольких сразу, в пакетах может содержаться даже архитектурно зависимый код. Система умеет правильно комбинировать такой код, а сам процесс сборки может быть расширен необходимой функциональностью, так как является полностью программируемым. Ко всему этому система сборки может работать не только со своими пакетами, но и пакетами из npm или любых других подобных сервисов.

Использование


Имена пакетов в Meteor имеют следующий формат username:packagename@version, где username имя контрибьютора, packagename имя пакета, а version соответственно версия. Основные пакеты, которые входят в состав самого Meteor не содержат имя автора пакета, это такие пакеты как http, coffeescript, standard-app-packages и прочие.

Дополнительную справку по командам, приведенным ниже, можно получить набрав

$ meteor help <command>


Добавление, обновление и удаление пакетов


Для добавления пакета необходимо просто запустить в терминале в папке с проектом следующую инструкцию:

$ meteor add username:packagename

Например meteor add iron:router. Для указания специфичной версии пакета, можно использовать meteor add username:packagename@version, например нам нужен пакет c версией 0.1.0 — выполняем meteor add username:packagename@0.1.0, в данном случае будет установлена указанная версия или выше, но совместимая с 0.1.0. Для указания точной версии нужно написать знак = перед версией: meteor add username:packagename@=0.1.0. Чтобы удалить специфичную версию можно просто ввести meteor add username:packagename.

Для обновления пакетов и Meteor в целом можно выполнить

$ meteor update

Данная команда также поддерживает несколько параметров: meteor update package1 package2 … — обновит только указанные пакеты, meteor update –packages-only — обновит все пакеты и не будет обновлять сам Meteor.

Удаление пакетов осуществляется через команду

$ meteor remove username:packagename


Зависимости и ограничения


Система пакетов фреймворка автоматически разрешает все зависимости, но может содержать только одну версию конкретного пакета, в связи с этим могут возникнуть некоторые ограничения. Например если пакет A и пакет B зависят от пакета C версии 1.1.0, но новая версия пакета A зависит от C@2.0.0, то запуск meteor update не обновит пакет A, так как это нарушить работу пакета B.

Также система пакетов не будет откатывать версии установленных пакетов. Например если вы поставите пакет A, который в зависимостях содержит пакет C, но при этом у вас был установлен пакет C, версией ниже, чем указана в зависимостях пакета A, то в таком случае пакет C обновится до новой версии, но при удалении пакета A откат версии у C не произойдет.

Поиск и отображение установленных пакетов


Все установленные пакеты и версии (если они были указаны) сохраняются в файле .meteor/packages. Этот файл может иметь примерно следующее содержание:

# Meteor packages used by this project, one per line.
#
# 'meteor add' and 'meteor remove' will edit this file for you,
# but you can also edit it by hand.

standard-app-packages
coffeescript
http
accounts-base
mrt:jquery-ui
mrt:moment
mrt:nprogress

Файл может быть отредактирован вручную и если Meteor в момент сохранения был запущен, то пакеты обновятся автоматически, также для просмотра списка установленных пакетов и их версий можно воспользоваться командой

$ meteor list

Увидеть полный список пакетов вместе с установленными зависимостями и их версии можно в файле .meteor/versions

Для получения подробной информации о пакете (доступные версии, описание, поддерживаемые платформы и авторы) можно ввести

$ meteor show <package>

Найти нужный пакет можно выполнив команду

$ meteor search <substr>

Поиск осуществляется по подстроке, и в выдачу попадут все пакеты содержащие подстроку в полном названии. В принципе в запрос можно передать регулярное выражение так как информация о пакетах находится в MongoDB, а запрос формируется, примерно, следующим выражением packages.find({ name: new RegExp(substr) }).

Создание и тестирование пакетов


Чтобы данное руководство не получилось слишком объемным и чтобы детально разобрать все моменты при создании пакета, предлагаю вам посмотреть все на примерах в специальном репозитории. Также вы можете склонировать проект и руками пощупать как это работает, так как все примеры являются рабочими.

Управление вашими пакетами


Аккаунт разработчика


Для публикации собственных пакетов вам необходимо завести аккаунт на сайте Meteor. И после чего авторизоваться на компьютере, с которого будут осуществляться управление пакетами, при помощи команды

$ meteor login


Публикация


Допустим Вы уже создали свой пакет, отладили и написали тесты. Чтобы поделиться им с сообществом вам необходимо выполнить всего одну команду:

$ meteor publish --create

Данная команда автоматически соберет пакет, находящийся в текущей директории и опубликует его на сервере. После чего вы можете попробовать найти свой пакет воспользовавшись командой meteor search packagename, либо поискать пакет на сайте Atmosphere.

Для публикации новой версии пакета достаточно выполнить команду без флага –create

$ meteor publish

После чего так же произойдет сборка и публикация пакета, но при публикации новой версии необходимо сменить номер в package.js, иначе произойдет ошибка.

Некоторые пакеты могут содержать код зависимый от архитектуры. На данный момент системой поддерживаются следующие: 32-bit Linux, 64-bit Linux и Mac OS. Для публикации версий пакета под различные архитектуры, необходимо на компьютере с нужной операционной системой установить Meteor, авторизоваться и запустить команду

$ meteor publish-for-arch <username:packagename@version>

При этом не обязательно загружать на этот компьютер сам пакет, система автоматически его загрузит, произведет сборку и публикацию.

Ссылки


  1. Анонс новой системы пакетов
  2. Зачем нужна еще одна система пакетов?
  3. Описание системы пакетов на английском, пока находится в разработке
  4. Описание команд, поддерживаемых Meteor
  5. Репозиторий с примерами
Tags:
Hubs:
+2
Comments7

Articles