momocus / sakazuki

自宅の酒を管理するアプリケーション
https://sakazuki.fly.dev/
MIT License
13 stars 4 forks source link

:gem: Rails 7.2 and YJIT #763

Open yonta opened 1 month ago

yonta commented 1 month ago

Rails 7.2がきたぞ! YJITを使ってローリスクハイリターンだ!

やること

参考になりそうなもの

yonta commented 1 month ago

Ruby 3.3.5もきてるから、先にこっち上げちゃおう

yonta commented 1 month ago

YJITはRuby3.3以上とRails7.2から

yonta commented 1 month ago

RailsガイドのRailsアップデート手順わかりやすくて助かる。 自分でも追っかけてみて、だいたいこんな感じでいけそう。

  1. GemfileのRailsバージョンのパッチバージョンを上げる
  2. bundle update rails
  3. package.jsonのrails依存をアップデート(うちにはなし)
  4. この時点で起動、rspecを実行、警告やテスト落ちの修正
  5. rails app:updateを実行する
    • config以下のファイルを最新版Railsのデフォルトにしてくれる
    • diffを確認して、デフォルトは適用、自分たちが設定した部分は残す
  6. また起動・rspec
  7. config/initializers/new_framework_defaults_X_X.rbのコメントアウトを1行ずつ外してチェック
    • 一気に全部やってみたり、次のステップでdefautlsを書き換えて一気に試してみてもよい
    • エラー起きたら考える
  8. 上記ファイルを削除しconfig/application.rbconfig.load_defaults(X.X)を上げる
    • これでconfig/initializers/new_framework_defaults_X_X.rbはいらない
  9. Railsのマイナーバージョンを上げて繰り返す
  10. Railsのメジャーバージョンを上げて繰り返す
yonta commented 1 month ago

Rubyのアップデートでcloudinary gemが警告出すようになった。 ostructってgemがRuby 3.5からデフォルトジェムじゃないからGemfileに追加しろ、って警告 cloudinaryのバージョンを上げることで対応。

yonta commented 1 month ago

Rails 7.1.4に上げた。 結構デフォルト設定が変わっている。

yonta commented 1 month ago

Rails7.1でlisten gemがデフォルトで入らなくなってた。

使える・使えないがあると開発時に混乱しそう。 SAKAZUKIでも削除することにする。

yonta commented 1 month ago

デフォルト設定あれこれしたときにspring削除しちゃった…。 デフォルトRailsだとGemfile上ではコメントアウトされており、手動でオンできる。

Railsの起動を早くするし、入れた状態を復帰しておく。

yonta commented 1 month ago

rspecまわすとRails.application.config.secretsが7.2で使えなくなるぞってdeprecate警告でるけど、どこで使ってる? 警告の該当ライン見ても使ってないが。

とりあえず7.2にしてみてエラーが出たらまた考える。

yonta commented 1 month ago

うおー、7.2.1にするぞ!

yonta commented 1 month ago

7.2.1の変更点 結構かわってる

devcontainer、GitHub CI、Rubocop OMAKASE、YJIT、Brakemanあたりが気になるね。

yonta commented 1 month ago

Rails 7.2.1をインストールしてから、rails new --database=postgresql --javascript=esbuild --devcontainer testapp_containerでどんなプロジェクトができるのか覗いてみましょうね。

yonta commented 1 month ago

devcontainer周り

ドキュメント

yonta commented 1 month ago

GitHub CI周り

yonta commented 1 month ago

Rubocop Omakase

TODO:もう少し設定内容を精査する必要がある

rubocop.ymlの現状

現状もOmakaseも最初に全Copsをオフにしている

やはり厳しく全部使っていこう!

デフォルトDisabledだけど有用そうなCops

Layout/FirstXXXBreak:

# bad
func(a,
     b)
# good
func(
  a,
  b,
)

Layout/MultilineAssignmentLayout

# bad
foo = if expression
  'bar'
end

# good
foo =
  if expression
    'bar'
  end

Layout/RedundantLineBreak

Layout/SingleLineBlockChain

Style/ArrayCoercion

Style/ArrayFirstLast

Style/AutoResourceCleanup

Style/CollectionMethods

Style/ReturnNil

Copsの調整

現状維持

現状のRSpecでのcontextで書ける文章のCops

RSpec/ContextWording:
  Prefixes:
    - when
    - with
    - without
    - if
    - unless
    - for
    - before
    - after
    - during

rubocop-performance

yonta commented 1 month ago

YJIT

yonta commented 1 month ago

Brakeman

Brakeman は、Ruby on Rails アプリケーションのセキュリティ脆弱性をチェックする静的解析ツールです。

設定とか

yonta commented 1 month ago

ひょっとしてSpringももういらないか。 Rails公式も「今のマシンスペックだと対して効果ないからデフォルトオフにするわ」って言ってるな。

実際、spring周りで複雑になって起動しないとかトラブルのも辛い。 消すかー。

https://github.com/rails/rails/pull/42997

yonta commented 1 month ago

bundle updateかけて全部アップデートすると、webdirverがアップデートされてcapybaraがwebdriverのdeprecated警告だすようになっちゃうな。 Rails 7.2を動かすためのアップデート以外のbundle updateは後回しにしよう。

yonta commented 1 month ago

Rails 7.2してrails app:update!!!

yonta commented 1 month ago

Rubocopの設定変えたら、ERBファイルがめっちゃLintに引っ掛かるようになった。 そりゃそうだ。 直すぞ!

ERBファイルのLinter

何やら新しいの見つけたので、比較してみる。

erb_lint

rubocop-erb

erblint rubocop-erb
エラー数 28 48 複数ブロックにまたがって解析するrubocop-erbのほうが検出数が多い
autocorrect 28 47 エラー数に比例して多いだけなので差はあまりない
.rubocop.ymlを継承 o o
.rubocop.ymlを継承して一部変更 o できるが、設定を変えるには別ファイルが増える。例えば、.rubocop-erb.ymlを作って以下のようにして、rubocop --config .rubocop-erb.ymlと叩く必要がある
<% if n == 0 %> x o 未完成の式なので、Style/NumericPredicateが検出できない
<%a %> o x erblintは独自Linterで検出
inherit_mode:
  merge:
    - Exclude

inherit_from: .rubocop.yml

require:
  - rubocop-erb

AllCops:
  Include:
    - "**/*.html.erb"

Style/MethodCallWithArgsParentheses:
  IgnoreMacros: false

チェック用ERBファイル

<%    page_title "Test"    %>
<%= t "this.is.also.good" %>
<% n = 0 %>
<% b = if n == 0 then 1 else 2 end %>

<%
  def hogehogehogehogehogehoge(str1, str2)
    str1 + str2
  end
%>
<% if n == 0 %>
  <% a = 1 %>
<% else %>
  <% a = hogehogehogehogehogehoge "012345678901234567890123456789012345678901234567890123456789",
         "abcdefghijklmnopq" %>
<% end %>
<html>
  <body>
    <%= a %>
  </body>
</html>

できることとできないことあるし、併用するか…。

yonta commented 1 month ago

でかい変更になったので、baseブランチを作ってそこに各種変更を1個ずつマージPRにする方式にしよう