Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
現実のRuby/Railsアップグレード外伝 ~そして僕はforkした~
Search
Yuichi Takeuchi
November 08, 2024
Technology
0
67
現実のRuby/Railsアップグレード外伝 ~そして僕はforkした~
現実のRuby/Railsアップグレード
の中で gemの依存関係問題でアップグレードできないときforkしますって話をしましたが、それについて少しだけ詳しく話します。
Yuichi Takeuchi
November 08, 2024
Tweet
Share
More Decks by Yuichi Takeuchi
See All by Yuichi Takeuchi
現実のRuby/Railsアップグレード
takeyuweb
4
6.8k
Shinjuku.rb #95 LT会!心の技術書を紹介しよう!
takeyuweb
0
40
リモートワークへの招待
takeyuweb
2
520
OSSにみるレールの外側
takeyuweb
0
200
Rails meets Content Security Policy
takeyuweb
1
520
Rails受託会社を作っている話
takeyuweb
0
110
社長が書いたクソコードたち
takeyuweb
0
1.8k
Rails 考古学:WebAPIを取り巻く環境の変化とRailsの対応について
takeyuweb
0
78
RubyでAmazon CloudWatch Events定期ジョブを書けるやつ作った話
takeyuweb
0
530
Other Decks in Technology
See All in Technology
これまでの計測・開発・デプロイ方法全部見せます! / Findy ISUCON 2024-11-14
tohutohu
3
360
障害対応指揮の意思決定と情報共有における価値観 / Waroom Meetup #2
arthur1
5
470
サイバーセキュリティと認知バイアス:対策の隙を埋める心理学的アプローチ
shumei_ito
0
380
Evangelismo técnico: ¿qué, cómo y por qué?
trishagee
0
350
Python(PYNQ)がテーマのAMD主催のFPGAコンテストに参加してきた
iotengineer22
0
470
第1回 国土交通省 データコンペ参加者向け勉強会③- Snowflake x estie編 -
estie
0
120
初心者向けAWS Securityの勉強会mini Security-JAWSを9ヶ月ぐらい実施してきての近況
cmusudakeisuke
0
120
ExaDB-D dbaascli で出来ること
oracle4engineer
PRO
0
3.8k
New Relicを活用したSREの最初のステップ / NRUG OKINAWA VOL.3
isaoshimizu
2
570
TanStack Routerに移行するのかい しないのかい、どっちなんだい! / Are you going to migrate to TanStack Router or not? Which one is it?
kaminashi
0
570
SREによる隣接領域への越境とその先の信頼性
shonansurvivors
2
510
IBC 2024 動画技術関連レポート / IBC 2024 Report
cyberagentdevelopers
PRO
0
110
Featured
See All Featured
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
93
16k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
47
2.1k
Happy Clients
brianwarren
98
6.7k
How to Ace a Technical Interview
jacobian
276
23k
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.4k
Practical Orchestrator
shlominoach
186
10k
Building a Scalable Design System with Sketch
lauravandoore
459
33k
Fireside Chat
paigeccino
34
3k
Imperfection Machines: The Place of Print at Facebook
scottboms
265
13k
The Invisible Side of Design
smashingmag
298
50k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
6
410
Typedesign – Prime Four
hannesfritz
40
2.4k
Transcript
現実の RUBY/RAILSアップグレード外伝 そして僕はFORKした KAIGI ON RAILS 2024 事後勉強会 @TAKEYUWEB
スピーカーについて • @takeyuweb • フリーランス→法人成り • Rails 1.1 ~ •
アップグレード経験多数 • Kaigi on Rails 2024 登壇
問題と解決 問題 • Gemの更新が止まってる • 新しいバージョンで 動かない • 依存関係を解決できない 解決
• Forkして自分で保守する • 別のgemに置き換える 保守されていないGEM refile globalize
GLOBALIZE • 多言語化用gem • ふつうのActiveRecordのような手触りで 多言語化を実現できる class People < ApplicationRecord
translates :greeting end people = People.new people.attributes = { greeting: "こんにちは、世界" , locale: :ja } people.attributes = { greeting: "Hello, World", locale: :en } people.save I18n.locale = :ja people.greeting # => "こんにちは、世界" I18n.locale = :en people.greeting # => "Hello, World"
GLOBALIZE • Rails 7.1~ • Passing the class as positional
argument is deprecated and will be removed in Rails 7.2. “位置引数としてクラスを渡すことは非推奨となり、Rails7.2で削除される予定です”
GLOBALIZE • ActiveRecord Serialization で第二引数としてcoderクラスを渡す書き方が非推奨となった ◦ coder: キーワード引数で渡す • アプリケーションを修正しても、警告が消えない
• globalize gemに原因があった # Rails 7.0まで class User < ApplicationRecord serialize :preferences, JSON end # Rails 7.1から class User < ApplicationRecord serialize :preferences, coder: JSON end
GLOBALIZE • serialize メソッドをオーバーライドしていた • Rails 7.1用の修正が必要 • 修正があるかgithubを確認する module
Globalize module AttributeMethods module Serialization def serialize(attr_name, class_name_or_coder = Object, **options) super(attr_name, class_name_or_coder, **options) # これ! # 省略 end end end end ActiveRecord::AttributeMethods::Serialization::ClassMethods .send(:prepend, Globalize::AttributeMethods::Serialization) 翻訳を意識せずに使える のは責務の分離の観点で よさそうだが、その実現の ためバージョン分岐しての モンキーパッチなどで壊れ やすくてつらい
GLOBALIZE • …, but none of the maintainers actively use
Globalize anymore. “もはやGlobalizeを積極的に使用しているメンテナはいません”
GLOBALIZE • …, but none of the maintainers actively use
Globalize anymore. “もはやGlobalizeを積極的に使用しているメンテナはいません” • やめたい • やめるのは簡単でなさそう ◦ アプリケーション全体で使われている ◦ 影響箇所がわかりづらい ◦ やめるプロジェクトも進めているが、いますぐは…
GLOBALIZE • 仕方ないのでForkする • 問題のコードをRails 7.1用に修正 ◦ 取り込まれていないが修正PRがあった ◦ 取り込んだ
• その後7.2でテストを実行するとエラー ◦ 別の問題 ◦ ActiveSupport::Deprecationの シングルトン利用が非推奨化 ◦ 自分で変更 ▪ ActiveSupport::Deprecation.silence ▪ ActiveSupport.deprecator.silence module Globalize module AttributeMethods module Serialization def serialize(attr_name, class_name_or_coder = Object, **options) if options[:coder].blank? if class_name_or_coder == ::JSON || [ :load, :dump ].all? { |x| class_name_or_coder.respond_to?(x) } options = options.merge(coder: class_name_or_coder, type: Object) else options = options.merge(coder: default_column_serializer, type: class_name_or_coder) end end super(attr_name, **options)
REFILE • ファイルアップロード機能を提供するgem • ActiveStorage以前のアップローダーgem • 長らくメンテされていない ◦ 実用的な機能は一通りある ▪
クラウドストレージ ▪ CDN • ファイルアップロード機能の乗り換えは大変 ◦ たとえば ▪ これまでにアップロードされた資産の扱い ▪ 配信や変換の仕組み
REFILE • Ruby 3.0 のキーワード引数の非互換性で壊れる • 修正方法は呼び出し側にダブルスプレッドをつければいい # 第三引数にハッシュを渡して @template.attachment_field(
@object_name, method, objectify_options(options) ) # object: と options ハッシュで受け取っている def attachment_field(object_name, method, object:, **options) # こうすれば動く @template.attachment_field( @object_name, method, **objectify_options(options) )
REFILE • 長らくメンテされていない(2回目)
REFILE • 仕方がないのでforkする(2回目)
REFILE-S3 • refileのプラグイン • S3バックエンド • Ruby 3.0で壊れる • open-uri
の変更 ◦ RUby 2.7まで`require 'open-uri'` すると、 `Kernel.open` を拡張していたが、3.0ではなくなった • Refile同様放置 • 仕方ないのでfork # これを Kernel.open(object(id).presigned_url(:get)) # こうする URI.open(object(id).presigned_url(:get))
WICKED_PDF (FORKしなかった) • RailsのビューをPDFとして返せるようにするやつ • wkhtmltopdfのラッパー • wkhtmltopdfは開発終了 ◦ Qt
WebKitを使ってレンダリング ◦ Qt WebKitの開発が止まってしまった • 移行先が課題
WICKED_PDF (FORKしなかった) 独自のDSL prawn 専用のエデ ィター Thinreports HTMLをPDF に変換 wicked_pdf
grover (puppeteer) Ferrum (pureruby)
WICKED_PDF (FORKしなかった) • ferrum gem ◦ render メソッドの調整で移行できた • wicked_pdfと同じく、RailsのビューをレンダリングしてPDFとして印刷する仕組み
◦ wicked_pdf QtWebKit ◦ ferrum Chronium ▪ 環境に入れたChromiumのバージョンが古くてフォントのフルセットが埋め込まれる事故が発生 ▪ Chromiumのバージョンアップで解消
FORKは最後の手段 • やむなくfork ◦ 修正が必要 ◦ メンテナンスされていない ◦ 移行が簡単ではない
FORKし(たりし)て思ったこと つらい 多機能・高機能なgem “標準”の振る舞いを変えてくるgem 全体と密結合するgem なんとかなる 軽量(薄い)なgem 境界がはっきりとわかるgem
GEMの選び方 • 自分が保守できるか? ◦ 多機能ではない ◦ メタプログラミングはほどほどに ◦ 標準の動きを変えない •
保守できないなら ◦ 継続性はありそうか? ▪専門知識が必要なgemは自分で保守が難しい ▪コントリビューションがありそうか ▪完成していて更新の必要がないものはなくてもok ◦ 置き換えできそうか ▪更新が止まっても代替手段へ切り替えでしのげること ▪シンプルであること アップグレードしていくために gemの 依存gem も注意 開発に専門知識が 必要なgemは置換え しやすそうな作りが 大切