概要
Gemのファーストコミットをするタイミングがあり、既存のGemでは「初期設定コマンド実行してね。みたいなのがあるけれどどうやってやるのか」と見ていて、少しまとめたので書いておきます
ほとんどが Railsガイド に書いてある内容なため、初心者向けの記事となっています
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
へコピーしています
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」に変更されている事を確認できます
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にかかわらずアプリケーション側でも行うことでより開発を加速させることができそうだと思うのでそのあたりも機会があれば見ていきます
引用・参照