Упаковка плагина Discourse в виде gem

Pavilion начал упаковывать некоторые плагины Discourse в виде ruby-гемов, начав с нашего клиента подписки.

Наш клиент подписки по-прежнему представляет собой отдельный плагин, который теперь загружает этот гем, но его бэкенд теперь полностью упакован в виде гема, а отдельный плагин вскоре будет полностью устаревшим. Это небольшое введение о том, как сделать то же самое с вашими плагинами, которые более подходят для упаковки в виде гемов.

Как работать с гемами

Прежде всего, вам нужно понять, как работать с ruby-гемами. Если вы никогда не создавали гем, я рекомендую сначала создать свой собственный стандартный гем в изоляции, прежде чем приступать к работе с плагином Discourse в виде гема. Я рекомендую ознакомиться с этим руководством:

Как плагины внедряют код в Discourse

Способ, которым гем плагина Discourse внедряет код в Discourse, точно такой же, как и у стандартного плагина. Единственное отличие — упаковка. Поэтому для работы с плагином в виде гема вам также нужно понять, как стандартный плагин внедряет код в Discourse. Здесь есть два основных момента, которые нужно понять:

  1. Плагин Discourse — это rails-движок. Вы, вероятно, уже об этом знаете, но вам нужно действительно понять, что это означает. Я рекомендую пройти это руководство по rails-движкам. Например, вам нужно понять, почему много кода в файле plugin.rb плагина Discourse обернуто в обратный вызов after_initialize.

  2. Как работает процесс инициализации Discourse. Здесь есть всего один файл, который нужно прочитать и понять, а именно файл discourse/discourse/config/application.rb. Именно там загружается большая часть rails-кода, загружается весь код плагинов и происходит инициализация плагинов. Изучите этот файл более подробно и поймите, где и как требуются файлы плагинов, а затем как они инициализируются.

Как работает плагин Discourse в виде гема

Чтобы объединить всё вышеизложенное, вам нужно понять, как две вышеупомянутые темы синтезируются в гем плагина Discourse. В частности, обратите внимание на следующее:

  1. В гем плагина Discourse файл engine.rb играет роль, аналогичную файлу plugin.rb, с несколькими отличиями в конфигурации. Ознакомьтесь с файлом engine.rb гема клиента подписки и сравните его со стандартным файлом plugin.rb.

  2. В гем плагина 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.

Если у вас возникнут вопросы или вы застрянете, напишите здесь, и я помогу вам.

14 лайков

Похоже, этот подход не позволяет охватить что-либо из тем Discourse в плагине? Возможно, более подходящее название — «Упаковка специфичного для Discourse Rails Engine в gem».

1 лайк

Верно, вам нужно отдельно обрабатывать всё, что касается фронтенд-фреймворка на JavaScript.

Хотя технически это верно, я не согласен, что такое название было бы лучше, так как это может отпугнуть некоторых нужных людей от чтения темы: большинство разработчиков плагинов могут не считать их «специфичными для Discourse Rails Engine».

Сейчас я чаще разделяю свой код на бэкенд-плагины и фронтенд-компоненты тем, чтобы иметь возможность очень быстро вносить изменения во фронтенд при развёртывании в тестовых и производственных средах.

3 лайка

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

И спасибо за то, что поделились этим.

1 лайк

Согласен, это продвинутая тема.