Pavilion начал упаковывать некоторые плагины Discourse в виде ruby-гемов, начав с нашего клиента подписки.
Наш клиент подписки по-прежнему представляет собой отдельный плагин, который теперь загружает этот гем, но его бэкенд теперь полностью упакован в виде гема, а отдельный плагин вскоре будет полностью устаревшим. Это небольшое введение о том, как сделать то же самое с вашими плагинами, которые более подходят для упаковки в виде гемов.
Как работать с гемами
Прежде всего, вам нужно понять, как работать с ruby-гемами. Если вы никогда не создавали гем, я рекомендую сначала создать свой собственный стандартный гем в изоляции, прежде чем приступать к работе с плагином Discourse в виде гема. Я рекомендую ознакомиться с этим руководством:
Как плагины внедряют код в Discourse
Способ, которым гем плагина Discourse внедряет код в Discourse, точно такой же, как и у стандартного плагина. Единственное отличие — упаковка. Поэтому для работы с плагином в виде гема вам также нужно понять, как стандартный плагин внедряет код в Discourse. Здесь есть два основных момента, которые нужно понять:
-
Плагин Discourse — это rails-движок. Вы, вероятно, уже об этом знаете, но вам нужно действительно понять, что это означает. Я рекомендую пройти это руководство по rails-движкам. Например, вам нужно понять, почему много кода в файле
plugin.rbплагина Discourse обернуто в обратный вызовafter_initialize. -
Как работает процесс инициализации Discourse. Здесь есть всего один файл, который нужно прочитать и понять, а именно файл discourse/discourse/config/application.rb. Именно там загружается большая часть rails-кода, загружается весь код плагинов и происходит инициализация плагинов. Изучите этот файл более подробно и поймите, где и как требуются файлы плагинов, а затем как они инициализируются.
Как работает плагин Discourse в виде гема
Чтобы объединить всё вышеизложенное, вам нужно понять, как две вышеупомянутые темы синтезируются в гем плагина Discourse. В частности, обратите внимание на следующее:
-
В гем плагина Discourse файл
engine.rbиграет роль, аналогичную файлуplugin.rb, с несколькими отличиями в конфигурации. Ознакомьтесь с файлом engine.rb гема клиента подписки и сравните его со стандартным файлом plugin.rb. -
В гем плагина Discourse вам нужно эмулировать
discourse/discourseв ваших rspec-тестах, чтобы правильно протестировать гем. Вам не нужно эмулировать всё приложение Discourse, только те части, которые вы тестируете. Для этого создайте каркасное rails-приложение с необходимыми классами и конечными точками Discourse и загрузите его как поддержку rspec. См. эмулированное приложение Discourse гема клиента подписки и то, как оно загружается в spec/rails_helper.rb.
Как загрузить локальный гем в плагин Discourse
Чтобы загрузить вашу локальную версию гема в плагин Discourse при работе с этим плагином и гемом в режиме разработки, выполните следующие действия.
Свяжите папку вашего гема символической ссылкой с соответствующей папкой гема плагина. Например, чтобы работать с моей локальной версией гема discourse_subscription_client в плагине discourse-subscription-client, я делаю следующее:
ln -s /Users/angus/discourse/gems/discourse_subscription_client /Users/angus/discourse/discourse/plugins/discourse-subscription-client/gems/3.2.1/gems
Затем измените имя папки символически связанного гема в плагине так, чтобы оно соответствовало шаблону имени стандартной папки гема, например:
discourse_subscription_client-0.1.0.pre11
Теперь при загрузке вашего плагина гем плагина Discourse загрузит вашу локальную версию вместо версии из rubygems.
Если у вас возникнут вопросы или вы застрянете, напишите здесь, и я помогу вам.