1
0

Gem追加したときの「まずはinstallコマンド実行してね」を見ていく

Posted at

概要

Gemのファーストコミットをするタイミングがあり、既存のGemでは「初期設定コマンド実行してね。みたいなのがあるけれどどうやってやるのか」と見ていて、少しまとめたので書いておきます

ほとんどが Railsガイド に書いてある内容なため、初心者向けの記事となっています :pray:

generate initializer

「初期設定コマンド実行してね。みたいなのがあるけれど...
これはアプリケーションにGemを追加したときに初期設定をアプリケーション側に記載する場合、Gem側からジェネレーターが提供されていることがあります

ここでは認証のgemとして使用する devise を例に取って確認してみます

deviseの例

deviseのREADMEに書いてある通り下記のコマンドでdeviseの初期設定を行うとconfig/initializers配下にdevise.rbが作成されます

$ rails generate devise:install

このコマンドを実行すると lib/generators/devise/install_generator.rb にあるメソッドが上から順に実行され、初回のcopy_initializer内にて下記の記述があり

Gem側に存在するlib/generators/templates/devise.rbファイルを
アプリケーションのconfig/initializers/devise.rbへコピーしています

lib/generators/devise/install_generator.rb
template "devise.rb", "config/initializers/devise.rb"

そのため、deviseの設定をアプリケーション側で用意に変更ができます

実際に試してみる

deviseの例で出てきたgeneratorを作成するためのgenerateコマンドを実行します

$ rails generate generator initializer
      create  lib/generators/initializer
      create  lib/generators/initializer/initializer_generator.rb
      create  lib/generators/initializer/USAGE
      create  lib/generators/initializer/templates

実行すると上記の結果となり

  • lib/generators/initializer
    • ディレクトリ
  • lib/generators/initializer/initializer_generator.rb
    • コマンド実行時にアプリケーション側で実行させたい処理
    • ex. config/initilizers配下に設定ファイルを作成する
  • lib/generators/initializer/USAGE
    • 使用方法のドキュメント
  • lib/generators/initializer/templates
    • initializer_generatorから呼ばれるテンプレートの保存場所

deviseの例だと下記のコマンドでコンフィグファイルを生成していましたが、InitializerGeneratorを利用しているので少しコマンドが異なります

# deviseの場合
$ rails generate devise:install

# 今回の例
$ rails generate initializer [Gemの名前]

基本的にはドキュメントに沿ったinitializerで作成するので良いと思います

sample code

アプリケーションの役割として名ばかりのblogというディレクトリと
Gem側としてlistableというディレクトリを用意しました

listable側にはinitialierを生成する処理を作成していますので
アプリケーション側でrails generate initializer listableを実行し、initializerファイルが作成されてアプリケーション側からGemの設定した値を覗いてみると「default」であることが確認できます

$ docker compose run --rm web bundle exec rails generate initializer listable
      create  config/initializers/listable.rb

$ docker compose run --rm web bundle exec rails c
Loading development environment (Rails 7.1.2)
irb(main):001> Listable.sample_attribute
=> "default"

この状態でconfig/initializers/listable.rbのコメントを外して再度実行すると「changed」に変更されている事を確認できます

config/initializers/listable.rb
Listable.configure do |config|
  config.sample_attribute = 'changed'
end
$ docker compose run --rm web bundle exec rails c
Loading development environment (Rails 7.1.2)
irb(main):001> Listable.sample_attribute
=> "changed"

サンプルコードはこちらに載せています

まとめ

あまりGemのinitializerなどを作成する機会はありませんでしたが既存の挙動がどうなっているのかを確認するよい機会となりました。
今回はinitializerだけをとりあげたものの、独自のgeneratorを作成するのはGemにかかわらずアプリケーション側でも行うことでより開発を加速させることができそうだと思うのでそのあたりも機会があれば見ていきます :dash:

引用・参照

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0