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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Yuichi Takeuchi
November 08, 2024
Technology
0
720
現実の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
13k
Shinjuku.rb #95 LT会!心の技術書を紹介しよう!
takeyuweb
0
87
リモートワークへの招待
takeyuweb
2
540
OSSにみるレールの外側
takeyuweb
0
230
Rails meets Content Security Policy
takeyuweb
1
690
Rails受託会社を作っている話
takeyuweb
0
130
社長が書いたクソコードたち
takeyuweb
0
1.9k
Rails 考古学:WebAPIを取り巻く環境の変化とRailsの対応について
takeyuweb
0
120
RubyでAmazon CloudWatch Events定期ジョブを書けるやつ作った話
takeyuweb
0
630
Other Decks in Technology
See All in Technology
ランサムウェア対策としてのpnpm導入のススメ
ishikawa_satoru
0
220
Bedrock PolicyでAmazon Bedrock Guardrails利用を強制してみた
yuu551
0
260
StrandsとNeptuneを使ってナレッジグラフを構築する
yakumo
1
130
SREのプラクティスを用いた3領域同時 マネジメントへの挑戦 〜SRE・情シス・セキュリティを統合した チーム運営術〜
coconala_engineer
2
770
20260208_第66回 コンピュータビジョン勉強会
keiichiito1978
0
200
広告の効果検証を題材にした因果推論の精度検証について
zozotech
PRO
0
210
登壇駆動学習のすすめ — CfPのネタの見つけ方と書くときに意識していること
bicstone
3
130
Ruby版 JSXのRuxが気になる
sansantech
PRO
0
170
モダンUIでフルサーバーレスなAIエージェントをAmplifyとCDKでサクッとデプロイしよう
minorun365
4
220
コスト削減から「セキュリティと利便性」を担うプラットフォームへ
sansantech
PRO
3
1.6k
学生・新卒・ジュニアから目指すSRE
hiroyaonoe
2
760
AIと新時代を切り拓く。これからのSREとメルカリIBISの挑戦
0gm
2
3.2k
Featured
See All Featured
Documentation Writing (for coders)
carmenintech
77
5.3k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
1
1.4k
First, design no harm
axbom
PRO
2
1.1k
Six Lessons from altMBA
skipperchong
29
4.2k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
0
3.4k
Thoughts on Productivity
jonyablonski
74
5k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
Producing Creativity
orderedlist
PRO
348
40k
A Modern Web Designer's Workflow
chriscoyier
698
190k
Between Models and Reality
mayunak
1
200
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
0
400
sira's awesome portfolio website redesign presentation
elsirapls
0
150
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は置換え しやすそうな作りが 大切