Submit Search
Upload
やさしいGemパッチの作り方
•
Download as PPTX, PDF
•
0 likes
•
987 views
Maki Toshio
Follow
#omotesandorb発表資料
Read less
Read more
Software
Report
Share
Report
Share
1 of 7
Download now
Recommended
社内Lt
社内Lt
Keiichi Kayama
Pf borforras
Pf borforras
k_watanabe
Ruby本から読み解くRuby考古学 - Ruby Archaeology from the Ruby Book
Ruby本から読み解くRuby考古学 - Ruby Archaeology from the Ruby Book
Tadashi Saito
LT#7 Hello coffeeしてきた
LT#7 Hello coffeeしてきた
Shingo Inoue
フリー雑誌におけるLibreOffceの使用例
フリー雑誌におけるLibreOffceの使用例
117Florian
WEBページを表示するまで
WEBページを表示するまで
Shoichi Kakizaki
Rubymotion
Rubymotion
jewel12
RubyではじめるIoT(Wakayama.rb活動報告)
RubyではじめるIoT(Wakayama.rb活動報告)
三七男 山本
Recommended
社内Lt
社内Lt
Keiichi Kayama
Pf borforras
Pf borforras
k_watanabe
Ruby本から読み解くRuby考古学 - Ruby Archaeology from the Ruby Book
Ruby本から読み解くRuby考古学 - Ruby Archaeology from the Ruby Book
Tadashi Saito
LT#7 Hello coffeeしてきた
LT#7 Hello coffeeしてきた
Shingo Inoue
フリー雑誌におけるLibreOffceの使用例
フリー雑誌におけるLibreOffceの使用例
117Florian
WEBページを表示するまで
WEBページを表示するまで
Shoichi Kakizaki
Rubymotion
Rubymotion
jewel12
RubyではじめるIoT(Wakayama.rb活動報告)
RubyではじめるIoT(Wakayama.rb活動報告)
三七男 山本
たのしいかたつむり講座 in 自宅ラックカレー部 2.0
たのしいかたつむり講座 in 自宅ラックカレー部 2.0
riku Urata
GR-CITRUSの紹介
GR-CITRUSの紹介
三七男 山本
スクリプトエンジンをつくる話
スクリプトエンジンをつくる話
すずしめ
初心から一週間で作ってみた Kinesis Client Library for Go
初心から一週間で作ってみた Kinesis Client Library for Go
Terui Masashi
goroutineはどうやって動いているのか
goroutineはどうやって動いているのか
ota42y
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をする
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をする
sairoutine
さわってみよう Couchbase Lite
さわってみよう Couchbase Lite
ssd kfk
CotEditor Script
CotEditor Script
Kosuke Usami
Mrubyについて 第16回 岡山ruby, ruby on rails勉強会
Mrubyについて 第16回 岡山ruby, ruby on rails勉強会
Masaya Konishi
Osc16gm
Osc16gm
Net Kanayan
なぜか技術書典5で 3サークルの運営をやってた話
なぜか技術書典5で 3サークルの運営をやってた話
ota42y
SwiftのWebフレームワークVaporを触ってみる
SwiftのWebフレームワークVaporを触ってみる
Yuya Oka
Ruby programmer silverの取得に向けて
Ruby programmer silverの取得に向けて
善弘 植木
Cocolumberjackの使い方 Ios lt 20140327
Cocolumberjackの使い方 Ios lt 20140327
Ken Haneda
@nukokusa_botを支える技術
@nukokusa_botを支える技術
Joe_noh
Thin reports再び
Thin reports再び
sy250
Js方眼紙
Js方眼紙
Ryo Sumasu
Mongo db as_a_building_block
Mongo db as_a_building_block
Akinobu Fukuzaki
レガシー環境で個人ベースでなんとか頑張るDVCS(Git)運用
レガシー環境で個人ベースでなんとか頑張るDVCS(Git)運用
kimukou_26 Kimukou
Ltdd01gulp入門公開用資料
Ltdd01gulp入門公開用資料
Kazuya Matsubara
RSpec Performance Turning
RSpec Performance Turning
Go Sueyoshi (a.k.a sue445)
Test::Kantan - Perl and Testing
Test::Kantan - Perl and Testing
Tokuhiro Matsuno
More Related Content
What's hot
たのしいかたつむり講座 in 自宅ラックカレー部 2.0
たのしいかたつむり講座 in 自宅ラックカレー部 2.0
riku Urata
GR-CITRUSの紹介
GR-CITRUSの紹介
三七男 山本
スクリプトエンジンをつくる話
スクリプトエンジンをつくる話
すずしめ
初心から一週間で作ってみた Kinesis Client Library for Go
初心から一週間で作ってみた Kinesis Client Library for Go
Terui Masashi
goroutineはどうやって動いているのか
goroutineはどうやって動いているのか
ota42y
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をする
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をする
sairoutine
さわってみよう Couchbase Lite
さわってみよう Couchbase Lite
ssd kfk
CotEditor Script
CotEditor Script
Kosuke Usami
Mrubyについて 第16回 岡山ruby, ruby on rails勉強会
Mrubyについて 第16回 岡山ruby, ruby on rails勉強会
Masaya Konishi
Osc16gm
Osc16gm
Net Kanayan
なぜか技術書典5で 3サークルの運営をやってた話
なぜか技術書典5で 3サークルの運営をやってた話
ota42y
SwiftのWebフレームワークVaporを触ってみる
SwiftのWebフレームワークVaporを触ってみる
Yuya Oka
Ruby programmer silverの取得に向けて
Ruby programmer silverの取得に向けて
善弘 植木
Cocolumberjackの使い方 Ios lt 20140327
Cocolumberjackの使い方 Ios lt 20140327
Ken Haneda
@nukokusa_botを支える技術
@nukokusa_botを支える技術
Joe_noh
Thin reports再び
Thin reports再び
sy250
Js方眼紙
Js方眼紙
Ryo Sumasu
Mongo db as_a_building_block
Mongo db as_a_building_block
Akinobu Fukuzaki
レガシー環境で個人ベースでなんとか頑張るDVCS(Git)運用
レガシー環境で個人ベースでなんとか頑張るDVCS(Git)運用
kimukou_26 Kimukou
Ltdd01gulp入門公開用資料
Ltdd01gulp入門公開用資料
Kazuya Matsubara
What's hot
(20)
たのしいかたつむり講座 in 自宅ラックカレー部 2.0
たのしいかたつむり講座 in 自宅ラックカレー部 2.0
GR-CITRUSの紹介
GR-CITRUSの紹介
スクリプトエンジンをつくる話
スクリプトエンジンをつくる話
初心から一週間で作ってみた Kinesis Client Library for Go
初心から一週間で作ってみた Kinesis Client Library for Go
goroutineはどうやって動いているのか
goroutineはどうやって動いているのか
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をする
Slack + Hubot でお前の一番好きな二次元嫁キャラと一緒に仕事をする
さわってみよう Couchbase Lite
さわってみよう Couchbase Lite
CotEditor Script
CotEditor Script
Mrubyについて 第16回 岡山ruby, ruby on rails勉強会
Mrubyについて 第16回 岡山ruby, ruby on rails勉強会
Osc16gm
Osc16gm
なぜか技術書典5で 3サークルの運営をやってた話
なぜか技術書典5で 3サークルの運営をやってた話
SwiftのWebフレームワークVaporを触ってみる
SwiftのWebフレームワークVaporを触ってみる
Ruby programmer silverの取得に向けて
Ruby programmer silverの取得に向けて
Cocolumberjackの使い方 Ios lt 20140327
Cocolumberjackの使い方 Ios lt 20140327
@nukokusa_botを支える技術
@nukokusa_botを支える技術
Thin reports再び
Thin reports再び
Js方眼紙
Js方眼紙
Mongo db as_a_building_block
Mongo db as_a_building_block
レガシー環境で個人ベースでなんとか頑張るDVCS(Git)運用
レガシー環境で個人ベースでなんとか頑張るDVCS(Git)運用
Ltdd01gulp入門公開用資料
Ltdd01gulp入門公開用資料
Viewers also liked
RSpec Performance Turning
RSpec Performance Turning
Go Sueyoshi (a.k.a sue445)
Test::Kantan - Perl and Testing
Test::Kantan - Perl and Testing
Tokuhiro Matsuno
How to Begin to Develop Ruby Core
How to Begin to Develop Ruby Core
Hiroshi SHIBATA
Quine・難解プログラミングについて
Quine・難解プログラミングについて
mametter
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 Ruby
mametter
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
Ruby and Distributed Storage Systems
Ruby and Distributed Storage Systems
SATOSHI TAGOMORI
Perfect Norikra 2nd Season
Perfect Norikra 2nd Season
SATOSHI TAGOMORI
Viewers also liked
(9)
RSpec Performance Turning
RSpec Performance Turning
Test::Kantan - Perl and Testing
Test::Kantan - Perl and Testing
How to Begin to Develop Ruby Core
How to Begin to Develop Ruby Core
Quine・難解プログラミングについて
Quine・難解プログラミングについて
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 Ruby
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Ruby and Distributed Storage Systems
Ruby and Distributed Storage Systems
Perfect Norikra 2nd Season
Perfect Norikra 2nd Season
More from Maki Toshio
Rails 6.1 → 7.0アップデート記録
Rails 6.1 → 7.0アップデート記録
Maki Toshio
自社サービスのAPIをOAuth2対応にして公開した
自社サービスのAPIをOAuth2対応にして公開した
Maki Toshio
Searched gems which supports only ruby 2.6
Searched gems which supports only ruby 2.6
Maki Toshio
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 Proxy
Maki Toshio
メール製品を作って気づいたmailライブラリの光と闇について語る
メール製品を作って気づいたmailライブラリの光と闇について語る
Maki Toshio
明日から使える(?)Rubyトリビア
明日から使える(?)Rubyトリビア
Maki Toshio
Rubyで簡単にremote access apiを実行する
Rubyで簡単にremote access apiを実行する
Maki Toshio
レガシーコード改善ガイド
レガシーコード改善ガイド
Maki Toshio
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アップデート記録
自社サービスのAPIをOAuth2対応にして公開した
自社サービスのAPIをOAuth2対応にして公開した
Searched gems which supports only ruby 2.6
Searched gems which supports only ruby 2.6
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 Proxy
メール製品を作って気づいたmailライブラリの光と闇について語る
メール製品を作って気づいたmailライブラリの光と闇について語る
明日から使える(?)Rubyトリビア
明日から使える(?)Rubyトリビア
Rubyで簡単にremote access apiを実行する
Rubyで簡単にremote access apiを実行する
レガシーコード改善ガイド
レガシーコード改善ガイド
Ruby on rails on hudsonの活用事例
Ruby on rails on hudsonの活用事例
やさしいGemパッチの作り方
1.
やさしい(※)Gemパッチの作り方 ※個人の感想です Toshio Maki(@Kirika_K2)
2.
Gemのカスタマイズあるある Gemをカスタマイズしたい 本家に提案したいが、機能がニッチすぎて微妙
仕方がないので、Forkしてソース改変して自社リポジトリに カスタマイズ案件が1つに留まらず、色んな人によって魔改造が続く そして時がたつ… オリジナルのGemのバージョンを上げたい 変更箇所が多すぎて崩壊 Gitのログとチケットと聞き込み調査を元に変更意図を追っていくしかない 担当者は死ぬ
3.
とあるmail gemの話 mailライブラリは便利
最小の労力でメールのテキストが作成できる(複雑なRFCの理解も不要) が、色々便利に気を回しすぎるため、お節介すぎるところもある Pull Requestの取り込みが遅い(欲しい機能が半年以上前にPRで出ているとかある) 他に選択肢もないので、mailライブラリに手を入れることにした 独自機能追加&Pull Requestに出ている欲しい機能を先行取り込み 1年後に上がったバージョンに追従(2.6.3 → 2.6.6) 変更点多すぎ😱 先行して取り込んだPull Requestがどう取り込まれたのか、よく分からない
4.
パッチ用の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を書く
5.
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をまとめる
6.
メリット・デメリット メリット gemspecのバージョンを変えてspecを走らせるだけでいいので、VerUpが楽
lib以下にはパッチ単位で変更点が並ぶので、機能の着脱が楽 mail_extension.rbでは拡張されるクラス単位で並ぶので、影響範囲が読みやすい パッチの数は少ないほどいいので、パッチを減らすモチベーションが働く (Pull Requestを投げて、取り込まれたらExtensionからパッチを外す) デメリット すべてprepend/extend/includeで書ききらないといけないので、ちょっと難しい 場合によってはprependの順序も気にする必要がある 元の実装上完全につぶさないといけないメソッドもありうる (NOTEコメントで注意書きを残しておく) prepend/extend/includeのオーバーヘッドがちょっと気になる
7.
公式へのPull Requestが一番 パッチを減らすために、なるべく公式へContributeする
明らかにバグなものは報告しやすいので、どんどんやる ニッチな機能やメリットの伝わりにくいリファクタリング をどう説明するかは結構課題。メリットの伝わりやすい機 能追加ストーリーの中に含められるなら、一緒に提案。
Download now