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
320
現実の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
8.8k
Shinjuku.rb #95 LT会!心の技術書を紹介しよう!
takeyuweb
0
42
リモートワークへの招待
takeyuweb
2
520
OSSにみるレールの外側
takeyuweb
0
200
Rails meets Content Security Policy
takeyuweb
1
550
Rails受託会社を作っている話
takeyuweb
0
110
社長が書いたクソコードたち
takeyuweb
0
1.8k
Rails 考古学:WebAPIを取り巻く環境の変化とRailsの対応について
takeyuweb
0
79
RubyでAmazon CloudWatch Events定期ジョブを書けるやつ作った話
takeyuweb
0
550
Other Decks in Technology
See All in Technology
WantedlyでのKotlin Multiplatformの導入と課題 / Kotlin Multiplatform Implementation and Challenges at Wantedly
kubode
0
240
[IBM TechXchange Dojo]Watson Discoveryとwatsonx.aiでRAGを実現!座学①
siyuanzh09
0
110
#TRG24 / David Cuartielles / Post Open Source
tarugoconf
0
570
[IBM TechXchange Dojo]Watson Discoveryとwatsonx.aiでRAGを実現!事例のご紹介+座学②
siyuanzh09
0
110
FODにおけるホーム画面編成のレコメンド
watarukudo
PRO
2
260
商品レコメンドでのexplicit negative feedbackの活用
alpicola
1
340
ABWGのRe:Cap!
hm5ug
1
120
アジャイルチームが変化し続けるための組織文化とマネジメント・アプローチ / Agile management that enables ever-changing teams
kakehashi
3
3.3k
いま現場PMのあなたが、 経営と向き合うPMになるために 必要なこと、腹をくくること
hiro93n
9
7.4k
東京Ruby会議12 Ruby と Rust と私 / Tokyo RubyKaigi 12 Ruby, Rust and me
eagletmt
3
850
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
6
54k
JAWS-UG20250116_iOSアプリエンジニアがAWSreInventに行ってきた(真面目編)
totokit4
0
140
Featured
See All Featured
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
3
360
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
How GitHub (no longer) Works
holman
312
140k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
59k
YesSQL, Process and Tooling at Scale
rocio
170
14k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
RailsConf 2023
tenderlove
29
970
Reflections from 52 weeks, 52 projects
jeffersonlam
348
20k
Git: the NoSQL Database
bkeepers
PRO
427
64k
A Philosophy of Restraint
colly
203
16k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
26
1.9k
Making Projects Easy
brettharned
116
6k
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は置換え しやすそうな作りが 大切