Madogiwa Blog

主に技術系の学習メモに使っていきます。

.railsrcとRailsテンプレートを使ってRails new関連の作業をコードで管理する

最近、割とRails newする機会があり.railsrcRailsテンプレートを使うといい感じにこのあたりの作業をコード管理して再現性と効率的に行えそうだったのでメモしておきます📝

.railsrcとは

~/.railsrcRails newで指定するオプションを書いておくと自動的にオプションを設定してくれます。

以下のように記載したファイルを配置するとテストライブラリとbundle installがスキップされます。

--skip-test-unit
--skip-bundle

また環境変数XDG_CONFIG_HOMEディレクトリを指定すると任意のディレクトリ配下のrails/railsrcを読み込むことも出来ます。

※こちらは.railsrcではなくrailsrcなので注意⚠   github.com

Railsテンプレートとは

Gemfileへの追加やapplication.rbのconfigの調整等をrubyファイルに記述することが出来る機能です。rails new -m template.rbで指定することでtemplate.rbに記述した任意の処理をrails new後に実行出来ます。

railsguides.jp

以下のような感じで色々行うことが出来ます。

# Gemの追加
gem 'lograge'
gem_group :development, :test do
  gem 'rubocop', require: false
end

# initializerの追加
initializer 'lograge.rb', <<~CODE
  Rails.application.configure do
    config.lograge.enabled = true
  end
CODE

# application.rbに設定を追加
environment <<~TEXT
  # For TZ
  config.time_zone = 'Tokyo'
  # config.active_record.default_timezone = :local
TEXT

railsrcとRailsテンプレートを使ってみる

というわけで.railsrcを使ってRails new時のオプションを、 Railsテンプレートを使ってRails new後に実施するGemfileapplication.rb等の調整、各種ファイル(.editorconfig.dockerignore等が出来るように自分も作ってみました。

.railsrcは以下のような形で、

--skip-bundle
--skip-action-mailbox
--skip-action-text
--skip-active-storage
--skip-action-cable
--skip-test-unit
--skip-jbuilder
--skip-spring
--skip-turbolinks
--skip-sprockets
--skip-javascript
--database=postgresql

Railsテンプレートは以下のような感じです。

# frozen_string_literal: true

def source_paths
  [__dir__]
end

gem 'okcomputer'
gem 'lograge'
gem 'simpacker'

gem_group :development, :test do
  gem 'brakeman', require: false
  gem 'rspec-rails', require: false
  gem 'factory_bot_rails'
  gem 'rubocop', require: false
  gem 'rubocop-performance', require: false
  gem 'rubocop-rails', require: false
  gem 'rubocop-rspec', require: false
end

initializer 'ok_computer.rb', <<~CODE
  OkComputer::Registry.register 'ruby version', OkComputer::RubyVersionCheck.new
  # OkComputer::Registry.register 'version', OkComputer::AppVersionCheck.new(env: 'SOURCE_VERSION')
CODE

initializer 'lograge.rb', <<~CODE
  Rails.application.configure do
    config.lograge.enabled = true
    config.lograge.custom_options = ->(event) { { time: Time.current } }
  end
CODE

environment <<~TEXT
  # For TZ
  config.time_zone = 'Tokyo'
  # config.active_record.default_timezone = :local

  # For custom settings
  config.settings = config_for(:settings)

  # For generator
  config.generators do |g|
    g.assets false
    g.helper false
    g.test_framework :rspec,
      fixtures:         true,
      view_specs:       false,
      helper_specs:     false,
      routing_specs:    false,
      controller_specs: false,
      request_specs:    false
    g.fixture_replacement :factory_bot, dir: 'spec/factories'
    g.after_generate do |files|
      system('bundle exec rubocop --auto-correct-all ' + files.join(' '), exception: true)
    end
  end
TEXT

copy_file '.rubocop.yml', '.rubocop.yml'
copy_file '.editorconfig', '.editorconfig'
copy_file 'config/simpacker.yml', 'config/simpacker.yml'
copy_file 'config/settings.yml', 'config/settings.yml'

run "cp .gitignore .dockerignore"

リポジトリで管理するようにしてみたので、

github.com

以下のような感じで使うことも出来ます。XDG_CONFIG_HOMEを指定してリポジトリ内の.railsrcを参照してRails newを行うようにしています。

$ clone git@github.com:Madogiwa0124/my_rails_template.git
$ cd my_rails_template
$ bundle install
$ XDG_CONFIG_HOME=./ bundle exec rails new sample_app -m ./rails/template.rb

Using --skip-bundle --skip-action-mailbox --skip-action-text --skip-active-storage --skip-action-cable --skip-test-unit --skip-jbuilder --skip-spring --skip-turbolinks --skip-sprockets --skip-javascript --database=postgresql from my_rails_template/rails/railsrc
      create  
      create  README.md
      create  Rakefile
      create  .ruby-version
      create  config.ru
      create  .gitignore
      create  .gitattributes
      create  Gemfile
         run  git init from "."
Initialized empty Git repository in my_rails_template/sample_app/.git/
      create  app
      create  app/assets/config/manifest.js
      create  app/assets/stylesheets/application.css
      create  app/channels/application_cable/channel.rb
      create  app/channels/application_cable/connection.rb
      create  app/controllers/application_controller.rb
      create  app/helpers/application_helper.rb
      create  app/javascript/channels/consumer.js
      create  app/javascript/channels/index.js
      create  app/javascript/packs/application.js
      create  app/jobs/application_job.rb
      create  app/mailers/application_mailer.rb
      create  app/models/application_record.rb
      create  app/views/layouts/application.html.erb
      create  app/views/layouts/mailer.html.erb
      create  app/views/layouts/mailer.text.erb
      create  app/assets/images
      create  app/assets/images/.keep
      create  app/controllers/concerns/.keep
      create  app/models/concerns/.keep
      create  bin
      create  bin/rails
      create  bin/rake
      create  bin/setup
      create  bin/spring
      create  bin/yarn
      remove  bin/spring
      remove  bin/yarn
      create  config
      create  config/routes.rb
      create  config/application.rb
      create  config/environment.rb
      create  config/puma.rb
      create  config/environments
      create  config/environments/development.rb
      create  config/environments/production.rb
      create  config/environments/test.rb
      create  config/initializers
      create  config/initializers/application_controller_renderer.rb
      create  config/initializers/assets.rb
      create  config/initializers/backtrace_silencers.rb
      create  config/initializers/content_security_policy.rb
      create  config/initializers/cookies_serializer.rb
      create  config/initializers/cors.rb
      create  config/initializers/filter_parameter_logging.rb
      create  config/initializers/inflections.rb
      create  config/initializers/mime_types.rb
      create  config/initializers/new_framework_defaults_6_1.rb
      create  config/initializers/permissions_policy.rb
      create  config/initializers/wrap_parameters.rb
      create  config/locales
      create  config/locales/en.yml
      create  config/master.key
      append  .gitignore
      create  config/boot.rb
      create  config/database.yml
      create  db
      create  db/seeds.rb
      create  lib
      create  lib/tasks
      create  lib/tasks/.keep
      create  lib/assets
      create  lib/assets/.keep
      create  log
      create  log/.keep
      create  public
      create  public/404.html
      create  public/422.html
      create  public/500.html
      create  public/apple-touch-icon-precomposed.png
      create  public/apple-touch-icon.png
      create  public/favicon.ico
      create  public/robots.txt
      create  tmp
      create  tmp/.keep
      create  tmp/pids
      create  tmp/pids/.keep
      create  tmp/cache
      create  tmp/cache/assets
      create  vendor
      create  vendor/.keep
      create  test/fixtures/files
      create  test/fixtures/files/.keep
      create  test/controllers
      create  test/controllers/.keep
      create  test/mailers
      create  test/mailers/.keep
      create  test/models
      create  test/models/.keep
      create  test/helpers
      create  test/helpers/.keep
      create  test/integration
      create  test/integration/.keep
      create  test/channels/application_cable/connection_test.rb
      create  test/test_helper.rb
      create  test/system
      create  test/system/.keep
      create  test/application_system_test_case.rb
      remove  app/javascript
      remove  config/initializers/assets.rb
      remove  app/javascript/channels
      remove  app/channels
      remove  test/channels
      remove  config/initializers/cors.rb
      remove  config/initializers/new_framework_defaults_6_1.rb
       apply  my_rails_template/rails/template.rb
     gemfile    okcomputer
     gemfile    lograge
     gemfile    simpacker
     gemfile    group :development, :test
        gsub    Gemfile
     gemfile    brakeman
     gemfile    rspec-rails
     gemfile    factory_bot_rails
     gemfile    rubocop
     gemfile    rubocop-performance
     gemfile    rubocop-rails
     gemfile    rubocop-rspec
        gsub    Gemfile
 initializer    ok_computer.rb
 initializer    lograge.rb
      create    .rubocop.yml
      create    .editorconfig
      create    config/simpacker.yml
      create    config/settings.yml
         run    cp .gitignore .dockerignore from "."

おわりに

.railsrcRailsテンプレートを使うと全部ではないですが、rails newするときの諸々の作業をコードで管理出来そうで良いですね。

参考

blog.kamipo.net

blog.willnet.in