🧐

Ruby3.1 + Rails7でRSpecの検証環境を作る

2022/02/07に公開

Rails7系がリリースされたので、それでRSpecの検証環境を作るためにやったことをまとめる

開発環境

OS macOS Monterey
MacBook Pro(14インチ、2021)
チップ Apple M1 Pro

Ruby 3.1.0 -> 3.1.0より古いとうまくいかない
Rails 7.0.1

ハマりどころ

M1 Macの初期状態だとopensslの設定がLibreSSLになっているので、切り替える必要がある
Ruby3.1.0からはOpenSSL@3が使えるが、3.1.0以前だとOpenSSL@1.1でないと動かない
Ruby2.4以下だとOpenSSL@1.1だと動かないので、更にダウングレードする必要があるらしい

# openssl確認
$ openssl version
LibreSSL 2.8.3

# LibreSSLからOpenSSLに切り替える
$ brew install openssl
$ brew link --force openssl@3
Linking /opt/homebrew/Cellar/openssl@3/3.0.1... 5487 symlinks created.

If you need to have this software first in your PATH instead consider running:
  echo 'export PATH="/opt/homebrew/opt/openssl@3/bin:$PATH"' >> ~/.zshrc

$ echo 'export PATH="/opt/homebrew/opt/openssl@3/bin:$PATH"' >> ~/.zshrc

$ source ~/.zshrc
$ which openssl
/opt/homebrew/opt/openssl@3/bin/openssl

https://qiita.com/kazu40808/items/35497642ad3d17bf6f2d
https://github.com/puma/puma/issues/2790
https://qiita.com/aiorange19/items/5ffaefc85f912f60c2fa

手順

$ mkdir test-app
$ cd test-app
$ rbenv local 3.1.0
$ ruby -v
ruby 3.1.0p0 (2021-12-25 revision fb4df44d16) [arm64-darwin21]

$ bundle init
Writing new Gemfile to /path/to/project_name/Gemfile

$ vi Gemfile
# frozen_string_literal: true
source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem "rails"

$ bundle install --path vendor/bundle --jobs=4
  • bundle install オプション
    • gemをプロジェクト内で管理するために --path を vendor/bundleに指定
    • --jobs=4で並行処理でインストールできるらしい(多分速い)

悩ましいRails new

rails7のnewのオプションは以下の通り

$ rails new --help
Usage:
  rails new APP_PATH [options]

Options:
      [--skip-namespace], [--no-skip-namespace]              # Skip namespace (affects only isolated engines)
      [--skip-collision-check], [--no-skip-collision-check]  # Skip collision check
  -r, [--ruby=PATH]                                          # Path to the Ruby binary of your choice
                                                             # Default: /Users/kosuke/.rbenv/versions/3.0.1/bin/ruby
  -m, [--template=TEMPLATE]                                  # Path to some application template (can be a filesystem path or URL)
  -d, [--database=DATABASE]                                  # Preconfigure for selected database (options: mysql/postgresql/sqlite3/oracle/sqlserver/jdbcmysql/jdbcsqlite3/jdbcpostgresql/jdbc)
                                                             # Default: sqlite3
  -G, [--skip-git], [--no-skip-git]                          # Skip .gitignore file
      [--skip-keeps], [--no-skip-keeps]                      # Skip source control .keep files
  -M, [--skip-action-mailer], [--no-skip-action-mailer]      # Skip Action Mailer files
      [--skip-action-mailbox], [--no-skip-action-mailbox]    # Skip Action Mailbox gem
      [--skip-action-text], [--no-skip-action-text]          # Skip Action Text gem
  -O, [--skip-active-record], [--no-skip-active-record]      # Skip Active Record files
      [--skip-active-job], [--no-skip-active-job]            # Skip Active Job
      [--skip-active-storage], [--no-skip-active-storage]    # Skip Active Storage files
  -C, [--skip-action-cable], [--no-skip-action-cable]        # Skip Action Cable files
  -A, [--skip-asset-pipeline], [--no-skip-asset-pipeline]    # Indicates when to generate skip asset pipeline
  -a, [--asset-pipeline=ASSET_PIPELINE]                      # Choose your asset pipeline [options: sprockets (default), propshaft]
                                                             # Default: sprockets
  -J, [--skip-javascript], [--no-skip-javascript]            # Skip JavaScript files
      [--skip-hotwire], [--no-skip-hotwire]                  # Skip Hotwire integration
      [--skip-jbuilder], [--no-skip-jbuilder]                # Skip jbuilder gem
  -T, [--skip-test], [--no-skip-test]                        # Skip test files
      [--skip-system-test], [--no-skip-system-test]          # Skip system test files
      [--skip-bootsnap], [--no-skip-bootsnap]                # Skip bootsnap gem
      [--dev], [--no-dev]                                    # Set up the application with Gemfile pointing to your Rails checkout
      [--edge], [--no-edge]                                  # Set up the application with Gemfile pointing to Rails repository
  --master, [--main], [--no-main]                            # Set up the application with Gemfile pointing to Rails repository main branch
      [--rc=RC]                                              # Path to file containing extra configuration options for rails command
      [--no-rc], [--no-no-rc]                                # Skip loading of extra configuration options from .railsrc file
      [--api], [--no-api]                                    # Preconfigure smaller stack for API only apps
      [--minimal], [--no-minimal]                            # Preconfigure a minimal rails app
  -j, [--javascript=JAVASCRIPT]                              # Choose JavaScript approach [options: importmap (default), webpack, esbuild, rollup]
                                                             # Default: importmap
  -c, [--css=CSS]                                            # Choose CSS processor [options: tailwind, bootstrap, bulma, postcss, sass... check https://github.com/rails/cssbundling-rails]
  -B, [--skip-bundle], [--no-skip-bundle]                    # Don't run bundle install

Runtime options:
  -f, [--force]                    # Overwrite files that already exist
  -p, [--pretend], [--no-pretend]  # Run but do not make any changes
  -q, [--quiet], [--no-quiet]      # Suppress status output
  -s, [--skip], [--no-skip]        # Skip files that already exist

Rails options:
  -h, [--help], [--no-help]        # Show this help message and quit
  -v, [--version], [--no-version]  # Show Rails version number and quit

Description:
    The 'rails new' command creates a new Rails application with a default
    directory structure and configuration at the path you specify.

    You can specify extra command-line arguments to be used every time
    'rails new' runs in the .railsrc configuration file in your home directory,
    or in $XDG_CONFIG_HOME/rails/railsrc if XDG_CONFIG_HOME is set.

    Note that the arguments specified in the .railsrc file don't affect the
    defaults values shown above in this help message.

Example:
    rails new ~/Code/Ruby/weblog

    This generates a skeletal Rails installation in ~/Code/Ruby/weblog.

今回はサクッと検証用のアプリが作ることを前提にするので、Asset Piplineを使う

  • rails new オプション
    • -B:ここでbundle installを行うとvendor以下に保存されないためskipさせる
    • -d:mysql:DBをmysqlに変更。デフォルトはsqlite3
    • -M:Mailer関連の項目をスキップ
    • -C:websocket使う予定がないのでActionCableをインストールしない
    • –skip-test:Rspecを使う予定なので、minitestはスキップ
    • --skip-turbolinks: turbolinksはいれない
$ bundle exec rails new . -d mysql -B -M -C --skip-test --skip-turbolinks
Gemfileを上書きしていいか聞かれる → yes

rails newの際にbundle installが走るが、vendor/bundleにインストールされないため、スキップ
なぜかsprockets-railsがインストールされないので、ここで手動でbundle install して入れる

$ bin/rails s
Could not find gem 'sprockets-rails' in locally installed gems.
Run `bundle install` to install missing gems.

$ bundle install
$ bin/rails db:create
$ bin/rails db:migrate
$ bin/rails s

動くのを確認

その後、Gemfileに

.
..
group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  gem 'factory_bot_rails' # 追記
  gem 'rspec-rails' # 追記
end
..
.
$ bundle install
$ bundle exec rspec
No examples found.


Finished in 0.00062 seconds (files took 0.06946 seconds to load)
0 examples, 0 failures

こっちの方がオススメだよ! 等のアドバイス等ありましたら、よろしくお願いします🙏

参考

https://zenn.dev/yukito0616/articles/7cd2dde18c90d4

https://qiita.com/yuitnnn/items/b45bba658d86eabdbb26

https://maetoo11.hatenablog.com/entry/2016/03/04/144216

https://qiita.com/jnchito/items/5c41a7031404c313da1f

Discussion