Posted at

Gemの作り方

More than 3 years have passed since last update.


Rubygems.org に登録

登録はこちらの form から。

https://rubygems.org/sign_up


開発マシンに Rubygems.org の API Token を配置

こちらのページの下の方に書いてある curl コマンド実行するか、手動で配置。

https://rubygems.org/profile/edit

以下のようなファイルが出来上がってれば、準備完了。

$ cat .gem/credentials

---
:rubygems_api_key: <your-api-token>


Bundler で Gem の雛形作成

<gem-name> の部分は他の gem とかぶらないように注意。

$ bundle gem <gem-name>

以下では nov-test-gem という gem を作る前提で話を進めます。

bundle gem すると、gem 公開に必要な各種設定ファイルや lib ディレクトリなどが生成されます。

$ bundle gem nov-test-gem

Creating gem 'nov-test-gem'...
MIT License enabled in config
Code of conduct enabled in config
create nov-test-gem/Gemfile
create nov-test-gem/.gitignore
create nov-test-gem/lib/nov/test/gem.rb
create nov-test-gem/lib/nov/test/gem/version.rb
create nov-test-gem/nov-test-gem.gemspec
create nov-test-gem/Rakefile
create nov-test-gem/README.md
create nov-test-gem/bin/console
create nov-test-gem/bin/setup
create nov-test-gem/.travis.yml
create nov-test-gem/.rspec
create nov-test-gem/spec/spec_helper.rb
create nov-test-gem/spec/nov/test/gem_spec.rb
create nov-test-gem/LICENSE.txt
create nov-test-gem/CODE_OF_CONDUCT.md
Initializing git repo in /Users/nov/Desktop/nov-test-gem


雛形を適宜編集


*.gemspec ファイル

まずは nov-test-gem/nov-test-gem.gemspec を開いて、TODO になっている箇所 (gem の説明等) を適宜編集しましょう。今回は Rubygems.org への公開を前提としているため、allowed_push_host の部分は丸ごと削除します。

普段は Gemfile に指定するような dependencies も、gem の場合は *.gemspec ファイルに指定します。(Gemfile からは gemspec を参照するようになっています)


lib 以下

lib 以下は gem の本体コードが配置されます。

ここには当該 gem の lib 直下が $LOAD_PATH に含まれる状態で動くよう、適宜コードを配置します。

この記事では、lib 以下はとりあえず default のまま放置することにして、nov-test-gem/lib/nov/test/gem/version.rb だけの状態で公開することにしましょう。default では first release が v0.1.0 になりますが、ここは適宜 v0.0.1 等にしてから初期公開した方が良いかもしれません。(個人の感想です)


Release

基本的には初期状態では必要な dependencies は全て手元にあるかとは思いますが、念のため bundle install しておきましょう。

*.gemfile に dependencies を追加した際などは、bundle install は必須です。

$ cd nov-test-gem

$ bundle install

そしておもむろに rake -T として、呼び出し可能な rake task をリストアップしてみましょう。

環境によっては bundle exec rake -T としないとエラーになることもあります。(bundle exec をつけて Gemfile に指定されたバージョン固定の依存 gem を使うのが正しい作法ではあります。長いけど)

$ rake -T

rake build # Build nov-test-gem-0.1.0.gem into the pkg directory
rake clean # Remove any temporary products
rake clobber # Remove any generated files
rake install # Build and install nov-test-gem-0.1.0.gem into system gems
rake install:local # Build and install nov-test-gem-0.1.0.gem into system gems without network access
rake release[remote] # Create tag v0.1.0 and build and push nov-test-gem-0.1.0.gem to Rubygems
rake spec # Run RSpec code examples

rake release なる task がありますね。実行してみましょう。(これも bundle exec rake release じゃないとダメなこともあり)

$ rake release

nov-test-gem 0.1.0 built to pkg/nov-test-gem-0.1.0.gem.
Tagged v0.1.0.
Pushed git commits and tags.
Pushed nov-test-gem 0.1.0 to rubygems.org.

リリース完了しましたね。

あとは、lib 以下を適宜編集し、version を上げながら、順次 rake release していくのみです。