やさしい(※)Gemパッチの作り方
※個人の感想です
Toshio Maki(@Kirika_K2)
Gemのカスタマイズあるある
 Gemをカスタマイズしたい
 本家に提案したいが、機能がニッチすぎて微妙
 仕方がないので、Forkしてソース改変して自社リポジトリに
 カスタマイズ案件が1つに留まらず、色んな人によって魔改造が続く
 そして時がたつ…
 オリジナルのGemのバージョンを上げたい
 変更箇所が多すぎて崩壊
 Gitのログとチケットと聞き込み調査を元に変更意図を追っていくしかない
 担当者は死ぬ
とあるmail gemの話
 mailライブラリは便利
 最小の労力でメールのテキストが作成できる(複雑なRFCの理解も不要)
 が、色々便利に気を回しすぎるため、お節介すぎるところもある
 Pull Requestの取り込みが遅い(欲しい機能が半年以上前にPRで出ているとかある)
 他に選択肢もないので、mailライブラリに手を入れることにした
 独自機能追加&Pull Requestに出ている欲しい機能を先行取り込み
 1年後に上がったバージョンに追従(2.6.3 → 2.6.6)
 変更点多すぎ😱
 先行して取り込んだPull Requestがどう取り込まれたのか、よく分からない
パッチ用のGemを作ることにした
lib/
mail_extension/
patches/
awesome_patch/
message.rb
body.rb
spec/
patches/
awesome_patch/
message_spec.rb
body_spec.rb
awesome_patch.rb
mail_extension.rb
mail_extension.gemspec
拡張元のGemをバージョンまで指定
add_dependency “mail”, “= 2.6.6”
パッチ単位でディレクトリを作成
変更対象のファイル名と同名にする
module MailExtension::Patches::AwesomePatch::Message
lib/mail_extension/patches/awesome_patch以下の
ファイルをrequireする
後述
パッチ以下のSpecを書く
mail_extension.rbの中身
require ‘lib/mail_extension/patches/awesome_patch’
require ‘lib/mail_extension/patches/great_patch’
require ‘lib/mail_extension/patches/good_patch’
module MailExtension
::Mail::Body.prepend Patches::AwesomePatch::Body
::Mail::Body.prepend Patches::GreatPatch::Body
::Mail::Body.prepend Patches::GoodPatch::Body
::Mail::Message.prepend Patches::AwesomePatch::Message
::Mail::Header.prepend Patches::GoodPatch::Header
end
作成したパッチをrequire
拡張するクラス単位で、
prependをまとめる
メリット・デメリット
 メリット
 gemspecのバージョンを変えてspecを走らせるだけでいいので、VerUpが楽
 lib以下にはパッチ単位で変更点が並ぶので、機能の着脱が楽
 mail_extension.rbでは拡張されるクラス単位で並ぶので、影響範囲が読みやすい
 パッチの数は少ないほどいいので、パッチを減らすモチベーションが働く
(Pull Requestを投げて、取り込まれたらExtensionからパッチを外す)
 デメリット
 すべてprepend/extend/includeで書ききらないといけないので、ちょっと難しい
 場合によってはprependの順序も気にする必要がある
 元の実装上完全につぶさないといけないメソッドもありうる
(NOTEコメントで注意書きを残しておく)
 prepend/extend/includeのオーバーヘッドがちょっと気になる
公式へのPull Requestが一番
 パッチを減らすために、なるべく公式へContributeする
 明らかにバグなものは報告しやすいので、どんどんやる
 ニッチな機能やメリットの伝わりにくいリファクタリング
をどう説明するかは結構課題。メリットの伝わりやすい機
能追加ストーリーの中に含められるなら、一緒に提案。

More Related Content

PDF
社内Lt
PDF
Pf borforras
PDF
Ruby本から読み解くRuby考古学 - Ruby Archaeology from the Ruby Book
PDF
LT#7 Hello coffeeしてきた
ODP
フリー雑誌におけるLibreOffceの使用例
PPTX
WEBページを表示するまで
PDF
Rubymotion
PDF
RubyではじめるIoT(Wakayama.rb活動報告)
社内Lt
Pf borforras
Ruby本から読み解くRuby考古学 - Ruby Archaeology from the Ruby Book
LT#7 Hello coffeeしてきた
フリー雑誌におけるLibreOffceの使用例
WEBページを表示するまで
Rubymotion
RubyではじめるIoT(Wakayama.rb活動報告)

What's hot (20)

PPTX
たのしいかたつむり講座 in 自宅ラックカレー部 2.0
PDF
GR-CITRUSの紹介
PDF
スクリプトエンジンをつくる話
PDF
初心から一週間で作ってみた Kinesis Client Library for Go
PPTX
goroutineはどうやって動いているのか
PPTX
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をする
PDF
さわってみよう Couchbase Lite
PDF
CotEditor Script
PDF
Mrubyについて 第16回 岡山ruby, ruby on rails勉強会
PDF
Osc16gm
PPTX
なぜか技術書典5で 3サークルの運営をやってた話
PDF
Ruby programmer silverの取得に向けて
PDF
Cocolumberjackの使い方 Ios lt 20140327
ODP
@nukokusa_botを支える技術
PDF
Thin reports再び
PDF
Js方眼紙
PDF
Mongo db as_a_building_block
PDF
レガシー環境で個人ベースでなんとか頑張るDVCS(Git)運用
PDF
Ltdd01gulp入門公開用資料
PDF
時代はMiddleman
たのしいかたつむり講座 in 自宅ラックカレー部 2.0
GR-CITRUSの紹介
スクリプトエンジンをつくる話
初心から一週間で作ってみた Kinesis Client Library for Go
goroutineはどうやって動いているのか
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をする
さわってみよう Couchbase Lite
CotEditor Script
Mrubyについて 第16回 岡山ruby, ruby on rails勉強会
Osc16gm
なぜか技術書典5で 3サークルの運営をやってた話
Ruby programmer silverの取得に向けて
Cocolumberjackの使い方 Ios lt 20140327
@nukokusa_botを支える技術
Thin reports再び
Js方眼紙
Mongo db as_a_building_block
レガシー環境で個人ベースでなんとか頑張るDVCS(Git)運用
Ltdd01gulp入門公開用資料
時代はMiddleman
Ad

Viewers also liked (9)

PDF
RSpec Performance Turning
PDF
Test::Kantan - Perl and Testing
PDF
How to Begin to Develop Ruby Core
PDF
Quine・難解プログラミングについて
PDF
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
PDF
Esoteric, Obfuscated, Artistic Programming in Ruby
ODP
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
PDF
Ruby and Distributed Storage Systems
PDF
Perfect Norikra 2nd Season
RSpec Performance Turning
Test::Kantan - Perl and Testing
How to Begin to Develop Ruby Core
Quine・難解プログラミングについて
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Esoteric, Obfuscated, Artistic Programming in Ruby
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Ruby and Distributed Storage Systems
Perfect Norikra 2nd Season
Ad

Similar to やさしいGemパッチの作り方 (6)

KEY
Bundler kanazawa.rb meetup #2 2012/09/19
PPT
メイドめーる
PDF
私はいかにしてpull request を行ったか - あるいは social development について
PPTX
How to make gem
PDF
PDF
Rails Controller Fundamentals
Bundler kanazawa.rb meetup #2 2012/09/19
メイドめーる
私はいかにしてpull request を行ったか - あるいは social development について
How to make gem
Rails Controller Fundamentals

More from Maki Toshio (11)

PDF
Rails 6.1 → 7.0アップデート記録
PDF
自社サービスのAPIをOAuth2対応にして公開した
PDF
Searched gems which supports only ruby 2.6
PPTX
ActiveRecordで複雑なクエリを書くのは間違っているのか
PPTX
ファイルシステムのスナップショット機能でバックアップを取得する
PPTX
Cloud Foundry Day in Tokyo Lightning Talk - Cloud Foundry over the Proxy
PDF
メール製品を作って気づいたmailライブラリの光と闇について語る
KEY
明日から使える(?)Rubyトリビア
ZIP
Rubyで簡単にremote access apiを実行する
ZIP
レガシーコード改善ガイド
PPT
Ruby on rails on hudsonの活用事例
Rails 6.1 → 7.0アップデート記録
自社サービスのAPIをOAuth2対応にして公開した
Searched gems which supports only ruby 2.6
ActiveRecordで複雑なクエリを書くのは間違っているのか
ファイルシステムのスナップショット機能でバックアップを取得する
Cloud Foundry Day in Tokyo Lightning Talk - Cloud Foundry over the Proxy
メール製品を作って気づいたmailライブラリの光と闇について語る
明日から使える(?)Rubyトリビア
Rubyで簡単にremote access apiを実行する
レガシーコード改善ガイド
Ruby on rails on hudsonの活用事例

やさしいGemパッチの作り方