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
400
現実の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
9.6k
Shinjuku.rb #95 LT会!心の技術書を紹介しよう!
takeyuweb
0
43
リモートワークへの招待
takeyuweb
2
520
OSSにみるレールの外側
takeyuweb
0
210
Rails meets Content Security Policy
takeyuweb
1
570
Rails受託会社を作っている話
takeyuweb
0
110
社長が書いたクソコードたち
takeyuweb
0
1.8k
Rails 考古学:WebAPIを取り巻く環境の変化とRailsの対応について
takeyuweb
0
80
RubyでAmazon CloudWatch Events定期ジョブを書けるやつ作った話
takeyuweb
0
560
Other Decks in Technology
See All in Technology
LINE NEWSにおけるバックエンド開発
lycorptech_jp
PRO
0
190
Reading Code Is Harder Than Writing It
trishagee
2
120
RayでPHPのデバッグをちょっと快適にする
muno92
PRO
0
190
【詳説】コンテンツ配信 システムの複数機能 基盤への拡張
hatena
0
210
CDKのコードを書く環境を作りました with Amazon Q
nobuhitomorioka
1
160
「正しく」失敗できる チームの作り方 〜リアルな事例から紐解く失敗を恐れない組織とは〜 / A team that can fail correctly
i35_267
4
780
【内製開発Summit 2025】イオンスマートテクノロジーの内製化組織の作り方/In-house-development-summit-AST
aeonpeople
2
540
Autonomous Database Serverless 技術詳細 / adb-s_technical_detail_jp
oracle4engineer
PRO
17
45k
クラウドサービス事業者におけるOSS
tagomoris
4
990
あなたが人生で成功するための5つの普遍的法則 #jawsug #jawsdays2025 / 20250301 HEROZ
yoshidashingo
2
240
NFV基盤のOpenStack更新 ~9世代バージョンアップへの挑戦~
vtj
0
340
データマネジメントのトレードオフに立ち向かう
ikkimiyazaki
6
1.2k
Featured
See All Featured
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
Build The Right Thing And Hit Your Dates
maggiecrowley
34
2.5k
Automating Front-end Workflow
addyosmani
1368
200k
Faster Mobile Websites
deanohume
306
31k
Into the Great Unknown - MozCon
thekraken
35
1.6k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
129
19k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
12
990
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Why Our Code Smells
bkeepers
PRO
336
57k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
10
1.3k
Raft: Consensus for Rubyists
vanstee
137
6.8k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
4
430
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は置換え しやすそうな作りが 大切