Что такое двигатель gem
Rails 4 Engines. Разработка gem’а через mountable engine — читаем логи сервера
Так уж случилось, что возникло непреодолимое желание написать свой Rails gem. Во-первых, академический интерес — такого еще не делал, во-вторых, назрела проблема, решение которой важно лично для меня и которое хотелось бы использовать в нескольких своих проектах.
На Хабре уже были статьи про создание gem’ов (раз два три)
Но на их основе создать полноценный gem нельзя — они сильно устарели и, как правило, представляют собой перевод скупой официальной документации. А главное, они в большей части описывают создание Readme и License файлов, а собственно функционал gem’a сводится к Hello World.
Проблема
«Sorry, but something went wrong.
If you are the application owner check the logs for more information.»
Ну а дальше — ssh к серверу, cd к папке приложения и раскопка логов. Что бы ни говорили поклонники vim и emacs, но пытаться найти что-то в логе с их помощью — то еще занятие. Проще уж запустить tailf и пытаться найти руками. Есть еще rmate, но у меня он как-то не прижился.
Сразу покажу, что получилось в итоге:
Все, что нужно, это прописать в Gemfile
и смонтировать его ( config/routes.rb ) в нужную точку приложения, например
После этого на вашем сервере
Если в приложении используется Devise, то нужно будет сначала ввести логин и пароль.
Как делать
Обычно для таких случаев используют sinatra-based gem’ы (например)
Лично я для своего gem’a не вижу в этом смысла, поскольку использую Rails и нет необходимости в синатре.
Для начала имеет смысл написать собственно приложение, которое впоследствии будет превращено в отдельный gem.
В моем случае оно будет состоять из одного конроллера и одного экшена:
Все просто, используем один Singleton класс, который выдает заданное количество строк из заданного .log файла. Сам класс Log интереса не представляет. Разве что сам способ получения лога:
Ruby нативно позволяет выполнить команды ОС, просто заключив ее в вот эти (хрен его знает, как они правильно называются) символы: `tail -n 40 production.log` — вернет последние 40 строк из файла.
Полученные строки помещаются в таблицу, слегка облагораживаются CSS и выводятся на экран.
Одна строчка JavaScript (известный фреймворк — Vanilla.js) прокручивает экран вниз, к последней строке:
Делаем gem из приложения.
Статьи на Хабре и уважаемый Ryan Bates описывали создание gem’a с помощью команды bundle gem. Последнее видео датируется ноябрем 2011 года.
Сейчас же создение Rails gem’ов рекомендуется делать через engines.
Engine — это по сути еще одно Rails приложение, которое будет запущено вместе с исходным и использующее (взаимно) его ресурсы. Сиамские близнецы, в общем. Или имплантанты, как кому больше нравится. В приложении-родителе указывается точка подключения нового engine/plugin/gem и далее по этому адресу доступна вся функциональность нового приложения. Объяснение примитивное, на пальцах, кому интересны подробности — я указал ссылки внизу.
Таким образом достаточно удобно реализовывать всяческие админки, gem’ы статистики, наблюдения за активностью и пр. В общем все то, что, с одной стороны, относительно независимо и не так тесно переплетается с основным приложением, а с другой стороны, задействует полную функциональность Rails — модели, контроллеры, представления и т.п.
В противном случае надо будет серьезно попотеть с порядком инициализации приложений, миграциями, разграничением доступа, безопасностью и т.п. Головняк тот еще, но нет ничего невозможного. Кому интересно — можно начать с вот этой статьи
Для gem’ов, работающих только с ограниченной функциональностью Rails (например создающих новый хелпер или фильтр контроллера) — лучше использовать плагины
Итак, создаем будущий gem с именем tail
Ключ —mountable собственно и отделяет создание mountable engine от относительно простого плагина.
Очень забавная команда. Если посмотреть на структуру папок, созданную в результате, то это будет смесь обычного Rails приложения и результата команды bundle gem .
Три основных момента:
Первое
папка lib будет основой будущего gem’a и самый главный файл в нем — engine.rb
Создается модуль с именем gem’a с изолированным пространством имен, в который будут завернуты все ваши модели, контроллеры, вьюхи и классы. Т.е. вместо класса SomeClass у вас будет Tail::SomeClass , то же самое с routes и путями — вместо, например, messages_path вы будете писать tail.messages_path , если нужно будет попасть в веб-часть gem’a.
Само-собой, это делается для того, чтобы исключить конфликты имен gem’a и приложений, куда он будет монтироваться.
Обратите внимание на структуру папок app/ в приложении: в каждую из них добавлена дополнительная подпапка с названием gem’a, к которую складываются нужные файлы. Влияет на пути к файлам и хелперам.
Второе,
файл .gemspec — кроме описания песональной информации в нем содержится список зависимостей от других gem’ов и список файлов, необходимых для сборки.
lib/version.rb — номер версии gem’a. Рекомендуется использовать нотацию, описанную в semver.org. Простая штука, но обращаю на нее внимание, потому что очередная публикация gem’a без изменения версии не допускается.
И третье:
Наполняем gem
Не использую scaffold, поскольку нет необходимости в CRUD и генерации представлений.
Переношу в сгенерированные файлы код из существующих классов. Стоит убедиться, что все работает, запустив фейковое приложение из test/dummy .
Всё, с этого момента gem можно подключать и отлаживать в другом приложении:
Главное не забывать обновлять файл с версиями и делать bundle update tail в приложении, использующим gem после каждого изменения.
Публикация
Чтобы опубликовать gem на rubygems, нужно зарегистрироваться там.
После этого в папке gem-проекта
Для сборки gem
в создании gem’a не участвует, просто это легкий способ указать rubygems credetnials для релиза. Нужно ввести только один раз.
Сразу после этого gem появится в поиске на rubygems и станет доступным через gem install для других разработчиков.
Итого
1. Чтобы создать mountable Rails gem, нужно сделать следующее:
создать скелет
2. Наполнить его привычным Rails приложением
Есть незначительные особенности, но их мало и они хорошо описаны
Очень просто посмотреть, что же вы сделали, запустив rails server в папке test/dummy/
4. Зарегистрироваться на rubygems.org и указать свои логин и пароль:
Вот и всё, вы счастливый обладатель собственного gem’a
К слову сказать, на момент публикации rubygems утверждает, что мой gem скачали уже 151 раз. Не очень верится, но приятно.
Вообще при разработке упор делался на простоту установки и использования — ничего лишнего. Совсем. Хотя есть и другие варианты — например, gem webtail отправляет содержимое лога в сокет и, соответственно, можно смотреть изменения логов в реальном времени. Меня такая реализация не устраивает, хотя бы потому, что нужна дополнительная пляска с фаерволами. Хотя красиво.
Очень надеюсь, что моя статья, и, кто его знает, сам gem окажутся небесполезными и сэкономят кому-нибудь время и нервы.
bot.kz — Новости IT
С Rails 3 была выпущена, разработчики писали Rails двигателей в новых чистых стилей, которые могут быть упакованы в RubyGems.Rails двигатель расфасованный приложение, которое может быть запущен или установлен в другом приложении Rails.Двигатель может иметь свои собственные модели, представления, контроллеры, генераторов и публично подают статические files.
(Изображение: maicos)
Теперь, если вам не нравится писать много кода, это хорошая новость, потому что это означает, что вы можете написать двигатель раз и использовать его снова и снова.Допустим, вы строите много веб-сайтов для малого бизнеса.Общее требование для таких веб-сайтов страницу со списком всех сотрудников компании, а также основные сведения о них.Это отличный кандидат на Rails жемчужина двигателя по причине того, изменится очень мало, и можно абстрагировать, общий набор requirements.
В этой статье мы будем ходить через процесс создания двигателя драгоценный камень, который можно использовать для создания базы данных поддерживаемых командой странице отображается список employees.
Enginex
Jose Valim, основной вклад Rails, создала инструмент под названием Enginex, что строительные леса Rails 3-совместимый драгоценных камней двигателя.Эта программа защищает вас от многих подводных камней, что разработчики двигателя жемчужина лицу.Он обеспечивает основные настройки, в том числе тестового приложения Rails, который вы должны будете получить started.
Для начала выполните следующие из командной строки в стандартный каталог проектов:
При этом, вы будете в конечном итоге с проектом в team_page каталог, содержащий стандартный Enginex scaffolding.
Set-Up
Чтобы настроить нашу жемчужину, мы будем модифицировать несколько файлов.Во-первых, наши team_page.gemspec и наши Gemfile нужно немного love.
Это настраивает наш gemspec, чтобы автоматически использовать файлы, которые мы совершили с Git, и любые исполняемые файлы можно добавить в будущем, и использовать VERSION константа, мы укажем в нашем gem.
Кроме того, по телефону gemspec в наших Gemfile , работает bundle install будет загружать зависимости от наших team_page.gemspec , что convention.
След, чтобы наш драгоценный камень в двигателе Rails, давайте добавлять или изменять трех файлов.Во-первых, наши верхнего уровня команды страницу файла:
Для mattr функций, наш ActiveSupport зависимостей требуется.Мы также создали хороший способ настроить наш драгоценный камень с self.setup метод.Двигатель должен в конце нашего файла, так что мы можем быть уверены, что любая зависимость указанных first.
Во-вторых, наш вариант файла:
Наконец, наш двигатель файла:
Это определяет два Rails initialize блоки, которые нам ключ в корневом каталоге с приложением хост Rails, а также выполнять любые файлы в корневой public каталог нашей gem.
Data Model
Для добавления модели в нашу жемчужину, мы в первую очередь необходимо указать миграции и генератор класса, чтобы скопировать его на хост-приложения Rails.Хотя этот процесс станет более прозрачным в Rails 3.1, теперь нам нужно построить несколько генераторов классов.Большой ресурс для этого можно найти по меньшей Непал Rails.
Во-первых, давайте добавим наши генераторы класса:
Добавление что это позволит разработчикам запускать rails g team_page из своих приложений Rails и создать необходимый файл миграции к власти нашей команды page.
Следующее, мы собрали образцы миграции:
Наконец, мы можем создать образец модели пространстве имен наших gem.
Что мы сделали до сих пор является прошел через шаги для начальной загрузки Rails 3 двигателя драгоценный камень.Это был сконфигурирован как двигатель, учитывая его собственный генератор миграции, и поставляется с ActiveRecord model.
Теперь давайте настроим наш драгоценный камень с маршрутом, контроллер и представление, что любой хост-приложения Rails может use.
Route
Rails двигателей драгоценных камней, при правил� …