【Rails Gem作成】xxx:installコマンドでファイル生成できるようにする方法

  • このエントリーをはてなブックマークに追加

Gemを作ってある機能をRailsアプリケーションに組み込めるようにしたい時や既に作成した機能をGemに切り出してテンプレート化する時に、DeviseやRSpecのように、rails generate xxx:installコマンドを実装したいと考えませんでしょうか?

今回はrails generate xxx:installコマンドを実装し、いくつかのファイルを自動生成する方法を解説します。

Gemを作成する

Gemを作成する

ご自身の作業フォルダまで移動し、bundle gemコマンドを入力します。

bundle gem SampleGem

このコマンドを初めて使うときは、テストで使用するフレームワークを聞かれます。私はよくrspecを使用するので、rspecと答えました。

続いてCoCとライセンスについて聞かれますので、そのままyesでいいでしょう。

CoCはCODE_OF_CONDUCTといい、このGemに貢献してくれる人のための約束事などを記します。yesと答えると、CODE_OF_CONDUCT.mdが作成されます。とりあえず作っておきます。

ライセンスはMITライセンスでいいですか?と聞かれているのでとりあえずyesにしておきましょう。LICENSE.txtが自動生成されます。

bundle gemコマンドはgemの雛形を作ってくれるコマンドで以下のようなフォルダ構造が作成されます。

SampleGem
├── CODE_OF_CONDUCT.md
├── Gemfile
├── Gemfile.lock
├── LICENSE.txt
├── README.md
├── Rakefile
├── SampleGem.gemspec
├── bin
│   ├── console
│   └── setup
├── lib
│   ├── SampleGem
│   │   └── version.rb
│   ├── SampleGem.rb
└── spec
    ├── SampleGem_spec.rb
    └── spec_helper.rb

gemspecファイルを編集する

gemのフォルダを作成できたらrake buildコマンドを使用してgem自体をインストールできる形にすることが目標になります。

SampleGem.gemspecファイルのTODOと書かれた部分を編集したり費用な部分を削除したりします。

TODOの部分が残ってしまっていると、最後にrake buildコマンドを使用するときに警告が出てしまいます。

require_relative 'lib/SampleGem/version'

Gem::Specification.new do |spec|
  spec.name          = "SampleGem"
  spec.version       = SampleGem::VERSION
  spec.authors       = ["ryucoding"]
  spec.email         = ["ryucoding@example.com"]

  spec.summary       = %q{SampleGem is eash CMS for company page} 
  spec.license       = "MIT"
  spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")

  spec.metadata["allowed_push_host"] = "none"
  # Specify which files should be added to the gem when it is released.
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
  spec.files         = Dir.chdir(File.expand_path('..', __FILE__)) do
    `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
  end
  spec.bindir        = "exe"
  spec.executables   = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
  spec.require_paths = ["lib"]
end

今回はGemとしてRubyGemsのWebサービスにアップロードまでは行いませんので、url関係は削除しておきました。

Rails::Generators::Baseクラスを継承したクラスを作成する

次にアプリケーション内部を実装していきます。

作成するアプリケーションの処理は、lib/SampleGem.rbに記述していきます。

今回は、rails generate SampleGem:installと入力するとファイルが作成されるようにします。

generateコマンドでファイルを作成したりするには、Rails::Generators::Baseというクラスを継承したサブクラスを作成する必要があります。以下の記述を加えてサブクラスを作成しましょう。

サブクラスの名前は、rails generate SampleGem:xxxxとするために、

XxxxxGeneratorというクラス名にする必要があります。

require "SampleGem/version"

module SampleGem
  class Error < StandardError; end

  class InstallGenerator < Rails::Generators::Base
    
  end
end

ここまでで、generatorの準備ができました。

インスタンスメソッドを定義する

generatorが処理を行えるようにインスタンスメソッドを定義していきます。

require "SampleGem/version"

module SampleGem
  class Error < StandardError; end

  class InstallGenerator < Rails::Generators::Base
    def create_model_file
      
    end

    def create_view_file
      
    end
  end
end

Rails::Generators::Baseクラスは定義されているメソッドを上から順次実行していきます。

今回であれば、create_model_fileとcreate_view_fileの2つのメソッドを実行します。

Rails::Generators::Baseクラスのメソッドを使用してファイルを作成する

ファイルを作成するメソッドを記述します。

require "SampleGem/version"

module SampleGem
  class Error < StandardError; end

  class InstallGenerator < Rails::Generators::Base
    def create_model_file
      create_file "app/models/test.rb", "# create from my gem"
    end

    def create_view_file
      create_file "app/views/layouts/test.html.erb", "<%# create from my gem %>"
    end
  end
end

Rails::Generators::Baseクラスにはcreate_fileメソッドがあります。使い方は以下の通りです。

create_file "作成するファイルパス", "ファイルの中身"

これで、ファイルを作成するgeneratorを実装することができました。

Railsアプリに実装する

他のRailsアプリにインストールできるように以下のコマンドでパッケージ化します。

rake build
=> SampleGem 0.1.0 built to pkg/SampleGem-0.1.0.gem.

pkg/SampleGem-0.1.0.gem.にパッケージ化されたアプリができるのでこれをインストール知っていきます。

SampleGem.rbとは別のRailsアプリのディレクトリに移動しましょう。

workspace
├── SampleGem
│   ├── pkg
│       └── SampleGem-0.1.0.gem
├── RailsApp

今回はRailsAppのディレクトリに移動することにします。RailsAppのディレクトリで以下のコマンドを入力します。

gem install --local ../SampleGem/pkg/SampleGem-0.1.0.gem

そしてGemfileにも記述を追加しておきます。

# 追加
gem 'SampleGem'

念の為bundle installを実行し、gemがアプリケーションで使えることをを確認しましょう。

bundle install
bundle list | grep SampleGem
=> * SampleGem (0.1.0)

上記のようにbundle listで入っていることが確認できればOKです。

generatorを使ってみる

では、実際に作成したgeneratorを使ってみましょう。

rails generate SampleGem:install
# =>
Running via Spring preloader in process 48155
      create  app/views/layout/text.erb
      create  app/views/layout/text2.erb

このようにファイルがcreateされればOKです。

お疲れ様でした。

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

スポンサードリンク

コメントを残す

*