Slide 1

Slide 1 text

2020/01/15 
 あなたの知ってるRubyGemsTips
 
 Gemを作るときの依存関係の書き方について
 もう一度考えてみた
 MedPeer, Inc.
 Jun Morita


Slide 2

Slide 2 text

自己紹介
 ● SIerのシステムエンジニアから2018年4月にメドピ アに入社。
 
 ● 入社後は、医師専用コミュニティサイト「MedPeer」 におけるニュースサービスのリニューアルや、クイ ズサービスの立ち上げ、Rails 5.2.0へのアップグ レードに従事。
 
 ● 現在は、新規事業となる医師向けのインターネット テレビ「MedPeer Channel」のサービス開発を担 当。
 @Madogiwa0124
 @madogiwa_boy


Slide 3

Slide 3 text

PR
 MedPeerの紹介


Slide 4

Slide 4 text

PR
 Misson(存在意義)
 Supporting Doctors, Helping Patients. 
 医師を支援すること。そして患者を救うこと。
 Vision(実現したい姿)
 集合知により医療を再発明する。


Slide 5

Slide 5 text

PR
 医師専用コミュニティサイトの運営をしています


Slide 6

Slide 6 text

PR
 医療業界でIT ✕ ?で色々なサービスを展開しています!


Slide 7

Slide 7 text

PR


Slide 8

Slide 8 text

PR
 We are hiring !
 MedPeerの紹介でした


Slide 9

Slide 9 text

今日話すこと(本題)
 `bundle gem gem_name`すると `Gemfile`と`gemspec`という2つ のファイルが作成されます。 (v2.0.2時点)
 どっちを使ったほうが良さそうか というのを色々考えてみました 


Slide 10

Slide 10 text

gemにおける依存の書き方のおさらい
 Gemfile / gemspec(add_development_dependency, add_dependency)
 add_development_dependency
 -> DEVELOPMENT依存性
   開発時に依存するgem
 add_dependency
 -> RUNTIME依存性
   実行時に依存するgem
 ※add_dependencyはadd_runtime_dependencyのailias
  https://guides.rubygems.org/specification-reference


Slide 11

Slide 11 text

gem installの基本的な流れ
 Ruby
 Gems.org
 PC
 metadata(gemspec)を取得
 
 依存gem含めてinstall
 install対象のgem


Slide 12

Slide 12 text

gemspecの内容を元にしているので、
 
 Gemfileに依存gemを記載しても、 installされない
 ※Gemfileに記載しても依存gemとしては扱われない
 gem installの基本的な流れ


Slide 13

Slide 13 text

gemを作るのにGemfileは必要ない
 
 
 
 
 gemの最小構成
 gemspecがあればgemが作れる
 gemspecを作り、
 gem build gemspecでビルドして
 .gemファイルを作ってあげれば、
 install可能なgemが作れる
 -> gem installにGemfileは必要ない 
 Ruby 2.7.0 リファレンスマニュアル library rubygems 
 https://docs.ruby-lang.org/ja/2.7.0/library/rubygems.html 
 


Slide 14

Slide 14 text

実行時に依存するgemは、
 gemspecに書いたほうが良さそう
 > It’s best practice to specify all the gems that our library depends on in the gemspec.
 > https://bundler.io/v2.0/guides/creating_gem.html#getting-started 
 開発時に依存するものは・・・?
 ということで、、、


Slide 15

Slide 15 text

基本的にはgemspecに書いといた方が良さそうだけど…
 ● 依存関係を明示する必要がないケース
 ● bundler独自の機能を使いたいケース
 開発時に依存するgemをどっちに書くか


Slide 16

Slide 16 text

● dotenv、pry等の依存してないが必要なgemを管 理したい場合等
 gem内に依存しているコードは無い。
 しかしadd_develop_dependencyに記載してしまうと、 RubyGems.orgに依存gemとして表示されてしまうので、Gemfile に記載して管理しておくケース等
 依存関係を明示する必要がないケース


Slide 17

Slide 17 text

● requires等を使いたい
 `gem ‘rubocop, require: true`行ってBundler.requireでrequireし たい
 ● RubyGems.org以外に配置してあるgemを参照した い
 まだRubyGems.orgに公開されてない開発中のgemが公開され るまで`source`を指定してinstallしたい等
 bundler独自の機能を使いたいケース


Slide 18

Slide 18 text

コミュニティでの議論
 ● Please deprecate (and/or rename) `add_development_dependency` #1104 
 https://github.com/rubygems/rubygems/issues/1104 
 `add_develop_dependency`は非推奨にして、Gemfileに書くようにした方がいいんじゃないか?と いった議論がされている。(現在はClose済み) 
 ● Remove `add_development_dependency` from new gems #7222 
 https://github.com/rubygems/bundler/pull/7222 
 `bundle gem`実行時に`add_develop_dependency`に記載されていたものがGemfileに記載され るようになった。(bundler 2.1.0でリリースされてる) 
 開発時に依存するgemをどっちに書くか


Slide 19

Slide 19 text

まとめ
 実行時に依存するgemは、
 gemspecを使った方が良さそう
 開発時に依存するgemは、
 色々な考え方がありそうだがbundle gem時のデフォルトもGemfile になったのでGemfileの方が良さそう?
 と個人的に思いました


Slide 20

Slide 20 text

ご清聴ありがとうございました
 MedPeer, Inc.
 Jun Morita