RailsプラグインGemの作成方法、RSpecテストまで含めたrails pluginの作り方

スポンサーリンク

Rails プラグイン Gem を作る方法の紹介です。現在の Rails では、プラグインを Gem としてビルドします。通常の Ruby Gem と異なるのは、Rails プラグイン Gem は Rails のコアフレームワーク自体を拡張することができる点です。Rails 自身を拡張して機能を追加したい場合は、Rails プラグインとして Gem を作成すると良いでしょう。

通常の Ruby Gem の作り方は、以下を参照お願いいたします。
Gemの作り方(Ruby Gem) | EasyRamble

また、Rails でライブラリとして組み込むことができる gem には、通常の Ruby Gem、Rails プラグイン、Rails エンジンの3種類があります。それぞれの違いについては、以下の解説がとても分かりやすいです。
Gem、Railtieプラグイン、Engine(full/mountable)の違いとそれぞれの基礎情報 – Qiita

— 環境 —
Rails 5.1.0
Ruby 2.4.1
macOS Sierra 10.12.4

【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました
スポンサーリンク

rails コマンドが使える環境を準備

Rails プラグインを作成するには、まず rails コマンドを使います。

上記のように rails コマンドを使用して雛形を作成するので、rails コマンドが使える環境である必要があります。ということで、まずはその準備です。

rails コマンドをグローバルにインストール
システムの ruby や rbenv 環境で…

とやれば、グローバルな環境で rails コマンドが使えるようになります。

rbenv 環境であれば、現在のバージョンの ruby の gem として rails が入ります。rails が利用する ActiveRecord や ActiveSupport などが全部インストールされます。これで、rails コマンドが利用できるようになります。

私は、グローバルな環境に rails をインストールするのが好みではないので、この方法は使わず以下に説明する bundler を使う方法を利用しています。

bundler で rails コマンドをインストール
もう一つの方法ですが、bundler を利用します。Rails プラグインを作成するディレクトリの vendor/bundle 以下に rails を配置して、bundle exec を通して rails コマンドを利用する方法です。以下の Rails アプリケーション作成と同様の手順となります。

Rails4 + MySQL でアプリを作成する導入部分の手順 | EasyRamble

まずは Rails プラグイン用のディレクトリを作成して bundle init。

bundle init で生成されたGemfileを編集します。

vendor/bundle 以下に rails をインストール。

これで、vendor/bundle ディレクトリに rails が入りました。ここまでで、ディレクトリ構成は以下の通り。

この bundler で入れた rails コマンドを使うには、bundle exec rails ~ と利用します。私はグローバル環境に rails を入れたくないので、こちらの bundler を通して rails コマンドを利用する方法を採用しています。

確認。

補足ですが、bundle install で nokogiri エラーが出る場合は以下等を参考お願いします。
Nokogiriインストールでlibxml2関連のエラー再発 | EasyRamble
nokogiri インストール時のエラー Running ‘patch’ for libxml2 2.8.0… ERROR | EasyRamble
El Capitanでgemのnative extensionビルド失敗に対応 | EasyRamble

以降の説明は、bundler 利用の場合で進めます。

Rails プラグインの雛形を生成

続いて、プラグイン雛形を生成します。Rails プラグイン作成用のディレクトリで作業を行う。

まずは、Rails デフォルトのテストツールである Test::Unit を使う場合です。/path/to/my_plugin にいる状態なので、カレントディレクトリに雛形を生成するために rails plugin new . とドットを指定して、雛形を生成するパスをカレントディレクトリに指定する。

–skip-bundle は bundle install を行わないオプション。後で Gemfile 編集後に bundle install します。

Test::Unit ではなくて RSpec を使う場合。

-T –skip-test-unit は Test::Unit を利用しない指定で、–dummy-path=spec/dummy はダミーの検証用 Rails アプリケーションのパス指定です。spec/dummy 以下に、検証用の Rails アプリケーションが生成されます。私は日頃から RSpec を使っていますので、こちらの RSpec 利用で雛形を生成します。

途中で Gemfile を上書きするかどうか尋ねられるので 「Y」(Yes)と入力。

これでディレクトリ構成は以下の通りになる。

Gemfile と my_plugin.gemspec の確認

上書きされた Gemfile を確認します。

Gemfile

rails plugin new コマンドで、Gemfile は上記のように上書きされました。gemspec の行によって、my_plugin.gemspec に記載された依存 gem が読み込まれます。

my_plugin.gemspec

my_plugin は rails と 開発環境での sqlite3 に依存する宣言が書かれている。

Git 管理にする

このあたりで git 管理にします。まずは .gitignore を編集。

.gitignore

続いて Git リポジトリを初期化。

以降、ファイル編集時には適宜コミットしていきます。

my_plugin.gemspec を編集

gemspec の authors 等の情報を編集。またデフォルトで記載されている TODO や FIXME の文字列があると、spec/dummy 以下の bin/rails コマンドがエラーになるので編集する必要があります。

my_plugin.gemspec

デバッグ用とテスト用に、開発環境(development)での依存(add_development_dependency)に、byebug と rspec-rails を追加しました。

bundle install

gemspec および Gemfile で追記した gem をインストールするために、bundle install を実行します。

RSpec の準備

spec 以下にテストケースを書いていくので、dummy の rails アプリケーション(spec/dummy)以下に、spec へのシンボリックリンクを作成する。

そして、spec/dummy ディレクトリのまま rspec の雛形を生成します。

これでディレクトリは以下のような構造となります。

rails_helper.rb を編集。

に変更します。dummy 用 rails アプリケーションの config ファイルを読み込む設定です。

この編集が終了したら、シンボリックリンクは必要なくなるので消します。

RSpec を書いて動作確認

さて、ここで RSpec を書いて動作確認してみますが、せっかくですのでテスト駆動開発のスタイルで進めてみます。作成中のプラグインで、ActionView を拡張して Rails の View ヘルパーに exclamatize というメソッドを追加します。exclamatize メソッドは、文字列と指定した数を引数で渡すと、末尾に「!」を指定数だけ追加するヘルパーです。

まずは、以下のような rspec テストを書きます。

spec/controllers/application_controller_spec.rb

テストを走らせる。

RSpec テストが上手く動作することを確認できましたが、テストが2つ失敗しています。これは exclamatize ヘルパーが存在しないことが原因です。以降 Rails プラグイン本体の作成で、View ヘルパー(ActionView)に exclamatize メソッドを追加する機能を作成します。

Rails プラグイン本体の作成

まずは、exclamatize ヘルパーを実装します。exclamatize メソッドは、文字列と指定した数を引数で渡すと、末尾に「!」を指定数だけ追加するヘルパーです。

lib/my_plugin/view_helpers/action_view.rb

「::ActionView::Base.send :include, self」の行で、Rails のコアクラスである ActionView::Base に include されます。

続いて、Railtie の機構を用いて、作成したモジュールが Rails に組み込まれるようにします。Rails::Railtie を継承したクラスで require する。

lib/my_plugin/railtie.rb

最後に、gem ロード時のエントリーポイントとなる lib/my_plugin.rb を編集。このファイルから、lib/my_plugin/railtie.rb など gem ライブラリに必要なファイルを読み込むようにします。

lib/my_plugin.rb

Rails コンソールとRSpec テストで動作確認

dummy の rails アプリケーションでコンソールを起動し、動作確認してみます。

上手く動いているようです。

また RSpec でもテスト実行を確認してみます。作成したモジュールを rails_helper から読み込むようにします。

spec/rails_helper.rb

テスト実行。

今度は RSpec テストが全部パスしました。以上で、ひと通り Rails プラグインの作成は終了です。

RubyGems に公開する

Ruby Gem として登録するためには、RubyGems(RubyGems.org)リポジトリに公開する必要があります。Ruby Gem 開発の場合、開発用リポジトリを GitHub にして、リリース時に rubygems.org に公開というフローが多いです。私もその運用にしています。

rubygems.org に公開するためには、まずビルドして公開用のパッケージを作ります。

RubyGems の API キーを取得。事前に、rubygems.org のアカウント取得が必要です。

取得した API キーを確認します。

最後に rubygems.org に公開です。

あとは、開発を行って開発用リポジトリ(GitHubなど)にプッシュ〜正式リリース(rubygems.orgに公開)を繰り返していきます。rubygems.org にリリース(アップデート)する場合は、バージョン番号を上げる必要があることに注意です。以前と同じバージョン番号だと弾かれてしまいます。

以上、RailsプラグインGemの作成方法でした。おつかれさまでした!なお、今回作成したサンプル用の Rails プラグイン Gem を GitHub に上げていますので、よろしかったらこちらもご参考ください。

takafumir/my_plugin: Sample for Rails plugin gem. MyPlugin adds exclamatize helper to ActionView.

スポンサーリンク
パーフェクト Ruby on Rails は、最近読んだ Rails 本の中では一番役に立った本です。Chef や Capistrano など Rails と共によく使用される技術にも触れてあります。Ruby on Rails 4 アプリケーションプログラミングは、入門的な内容で Rails の機能全体を網羅されています。
 
スポンサーリンク

Leave Your Message!