LoginSignup
12
11

More than 3 years have passed since last update.

Gem 開発方法と気をつけることまとめ

Last updated at Posted at 2018-02-03

概要

  • Gem を作ったので、次以降のために覚えておきたいことをメモ

流れ

ひな形作成

  • bundle gem foo を実行
    • Gem 名に応じてひな形の構成も変わる
    • この構成自体は仕様ではなく、あくまで慣例。後述する gemspec で各種パス名を設定しているので、もっとヘンテコな構成やフォルダ名にもできるが、無論そうするメリットはない

gemspec を修正

  • 以下、ポイントだけかいつまんで説明

spec.files

  • Gem に含めたいファイルはここで全て指定する必要があるが、bundle gem でひな形を作るとデフォルトで git 管理しているファイルがすべて含まれるようになるので、あまり意識しなくてよい

spec.require_paths

  • この Gem を require したときに実際にロードするファイルのパス。デフォルトだと lib が指定されており、それが慣例なので従っておくとよい。主にこのパス配下にコードを書いていくことになる

spec.executables

  • rspec のようにコマンドラインから実行できるタイプの Gem を作る場合、実行したい Ruby スクリプトをここで指定する。これもデフォルトで exe 配下を全て含むように書かれているので、あまり意識しなくてよい

spec.bindir

  • 上述した spec.executables で指定した ruby スクリプトを探索するためのパス。デフォルトだと exe が指定されている。bin ではないので注意。 bin には Gem 開発中に使うコマンドを入れるとよい

spec.add_runtime_dependency

  • この Gem をインストールしたときに、ここで指定した依存 Gem があわせてインストールされる。不用意にバージョンを縛りすぎないように注意。個人的にはメジャーバージョンが変わらなければ OK くらいの指定がいいと思う

spec.add_development_dependency

  • minitest など、開発中にだけ使う依存 Gem をここに書く。Gemfile に書かないように注意。Gemfile 中の gemspec がこれを読み込んでくれるので、bundle install で普段通りインストールできる

lib を実装

  • lib 配下に .rb ファイルは1つだけにする(Gem名.rb)
    • Gem を require すると、先述した require_paths で指定したパス(今で言う lib/)が $LOAD_PATH に追加される(参考)。そのため、lib/ 配下に例えば erb.rb のようなファイルを置いてしまうと、require "erb" したときにそれがロードされるようになってしまう(= 一般的な ERB がロードできなくなってしまう)。
ダメな例
.
└── lib
    ├── foo
    │   └── cgi.rb
    ├── erb.rb
    ├── foo.rb
    └── set.rb

# http://guides.rubygems.org/patterns/#loading-code より引用
  • 他のファイルを読み込むのに __FILE__ は使わなくていい
    • 前述の通り require した時点で lib/ が $LOAD_PATH に追加されているので、その前提に立って単純に require できる。例えば上記の「ダメな例」のような構成のとき、foo.rb 内で foo/cgi.rb をロードしたければ、単純に require foo/cgi と書けばよい

その他メモ

バージョン番号の付け方

  • Semantic Versioning に従う
    • MAJOR.MINOR.PATCH
    • MAJOR : 後方互換のない機能追加があったらインクリメント
    • MINOR : 後方互換のある機能追加があったらインクリメント
    • PATCH : 後方互換のあるちょっとしたバグ修正があったらインクリメント

参考

12
11
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
11