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
120
現実の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.1k
Shinjuku.rb #95 LT会!心の技術書を紹介しよう!
takeyuweb
0
42
リモートワークへの招待
takeyuweb
2
520
OSSにみるレールの外側
takeyuweb
0
200
Rails meets Content Security Policy
takeyuweb
1
530
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
Amazon VPC Lattice 最新アップデート紹介 - PrivateLink も似たようなアップデートあったけど違いとは
bigmuramura
0
190
Amazon Kendra GenAI Index 登場でどう変わる? 評価から学ぶ最適なRAG構成
naoki_0531
0
100
Wvlet: A New Flow-Style Query Language For Functional Data Modeling and Interactive Data Analysis - Trino Summit 2024
xerial
1
110
5分でわかるDuckDB
chanyou0311
10
3.2k
Amazon SageMaker Unified Studio(Preview)、Lakehouse と Amazon S3 Tables
ishikawa_satoru
0
150
LINEスキマニにおけるフロントエンド開発
lycorptech_jp
PRO
0
330
マイクロサービスにおける容易なトランザクション管理に向けて
scalar
0
110
Turing × atmaCup #18 - 1st Place Solution
hakubishin3
0
470
【re:Invent 2024 アプデ】 Prompt Routing の紹介
champ
0
140
サーバレスアプリ開発者向けアップデートをキャッチアップしてきた #AWSreInvent #regrowth_fuk
drumnistnakano
0
190
1等無人航空機操縦士一発試験 合格までの道のり ドローンミートアップ@大阪 2024/12/18
excdinc
0
150
WACATE2024冬セッション資料(ユーザビリティ)
scarletplover
0
190
Featured
See All Featured
We Have a Design System, Now What?
morganepeng
51
7.3k
Gamification - CAS2011
davidbonilla
80
5.1k
KATA
mclloyd
29
14k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
59k
Keith and Marios Guide to Fast Websites
keithpitt
410
22k
Building an army of robots
kneath
302
44k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
5
440
GraphQLの誤解/rethinking-graphql
sonatard
67
10k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
1.9k
A Modern Web Designer's Workflow
chriscoyier
693
190k
Producing Creativity
orderedlist
PRO
341
39k
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は置換え しやすそうな作りが 大切