SlideShare a Scribd company logo
1 of 7
やさしい(※)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

What's hot

たのしいかたつむり講座 in 自宅ラックカレー部 2.0
たのしいかたつむり講座 in 自宅ラックカレー部 2.0たのしいかたつむり講座 in 自宅ラックカレー部 2.0
たのしいかたつむり講座 in 自宅ラックカレー部 2.0riku Urata
 
スクリプトエンジンをつくる話
スクリプトエンジンをつくる話スクリプトエンジンをつくる話
スクリプトエンジンをつくる話すずしめ
 
初心から一週間で作ってみた Kinesis Client Library for Go
初心から一週間で作ってみた Kinesis Client Library for Go初心から一週間で作ってみた Kinesis Client Library for Go
初心から一週間で作ってみた Kinesis Client Library for GoTerui Masashi
 
goroutineはどうやって動いているのか
goroutineはどうやって動いているのかgoroutineはどうやって動いているのか
goroutineはどうやって動いているのかota42y
 
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をする
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をするSlack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をする
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をするsairoutine
 
さわってみよう Couchbase Lite
さわってみよう Couchbase Liteさわってみよう Couchbase Lite
さわってみよう Couchbase Litessd kfk
 
Mrubyについて 第16回 岡山ruby, ruby on rails勉強会
Mrubyについて   第16回 岡山ruby, ruby on rails勉強会Mrubyについて   第16回 岡山ruby, ruby on rails勉強会
Mrubyについて 第16回 岡山ruby, ruby on rails勉強会Masaya Konishi
 
なぜか技術書典5で 3サークルの運営をやってた話
なぜか技術書典5で 3サークルの運営をやってた話なぜか技術書典5で 3サークルの運営をやってた話
なぜか技術書典5で 3サークルの運営をやってた話ota42y
 
SwiftのWebフレームワークVaporを触ってみる
SwiftのWebフレームワークVaporを触ってみるSwiftのWebフレームワークVaporを触ってみる
SwiftのWebフレームワークVaporを触ってみるYuya Oka
 
Ruby programmer silverの取得に向けて
Ruby programmer silverの取得に向けてRuby programmer silverの取得に向けて
Ruby programmer silverの取得に向けて善弘 植木
 
Cocolumberjackの使い方 Ios lt 20140327
Cocolumberjackの使い方 Ios lt 20140327Cocolumberjackの使い方 Ios lt 20140327
Cocolumberjackの使い方 Ios lt 20140327Ken Haneda
 
@nukokusa_botを支える技術
@nukokusa_botを支える技術@nukokusa_botを支える技術
@nukokusa_botを支える技術Joe_noh
 
Thin reports再び
Thin reports再びThin reports再び
Thin reports再びsy250
 
Mongo db as_a_building_block
Mongo db as_a_building_blockMongo db as_a_building_block
Mongo db as_a_building_blockAkinobu Fukuzaki
 
レガシー環境で個人ベースでなんとか頑張るDVCS(Git)運用
レガシー環境で個人ベースでなんとか頑張るDVCS(Git)運用レガシー環境で個人ベースでなんとか頑張るDVCS(Git)運用
レガシー環境で個人ベースでなんとか頑張るDVCS(Git)運用kimukou_26 Kimukou
 
Ltdd01gulp入門公開用資料
Ltdd01gulp入門公開用資料Ltdd01gulp入門公開用資料
Ltdd01gulp入門公開用資料Kazuya Matsubara
 

What's hot (20)

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

Viewers also liked

Test::Kantan - Perl and Testing
Test::Kantan - Perl and TestingTest::Kantan - Perl and Testing
Test::Kantan - Perl and TestingTokuhiro Matsuno
 
How to Begin to Develop Ruby Core
How to Begin to Develop Ruby CoreHow to Begin to Develop Ruby Core
How to Begin to Develop Ruby CoreHiroshi SHIBATA
 
Quine・難解プログラミングについて
Quine・難解プログラミングについてQuine・難解プログラミングについて
Quine・難解プログラミングについてmametter
 
Cookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 RubyをコンパイルしようCookpad 17 day Tech internship 2017 言語処理系入門 Rubyをコンパイルしよう
Cookpad 17 day Tech internship 2017 言語処理系入門 RubyをコンパイルしようKoichi Sasada
 
Esoteric, Obfuscated, Artistic Programming in Ruby
Esoteric, Obfuscated, Artistic Programming in RubyEsoteric, Obfuscated, Artistic Programming in Ruby
Esoteric, Obfuscated, Artistic Programming in Rubymametter
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるpospome
 
Ruby and Distributed Storage Systems
Ruby and Distributed Storage SystemsRuby and Distributed Storage Systems
Ruby and Distributed Storage SystemsSATOSHI TAGOMORI
 
Perfect Norikra 2nd Season
Perfect Norikra 2nd SeasonPerfect Norikra 2nd Season
Perfect Norikra 2nd SeasonSATOSHI TAGOMORI
 

Viewers also liked (9)

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

More from Maki Toshio

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

More from Maki Toshio (11)

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

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