概要

  • 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 : 後方互換のあるちょっとしたバグ修正があったらインクリメント

参考

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.