cre8cre8
AskMe♥

さっくりとgemを公開してみる

「さっくりとgemを公開してみたかった。」

こんばんわ。たくみです。
今回は難しいと勝手に先入観を抱いている、自作のgemを作成してリリース(公開)するまでの手順を、
なるべく手間をかけず、シンプルだけど、基礎はばっちりと抑えて解説します。
自作gemを公開することだけに命を燃やした記事なので、余計な成分はなんと0%です!

それでは、さっそくやっていきましょう!

bundle gem コマンドで雛形一式を自動生成

bundle gemコマンドを使用してgem公開に必要なファイルを自動生成します。
gemの名前を指定できますが、リリースするために他のgemと被らないユニークな名前をつけると
最後のリリースのステップのときにハマらなくてすむようになります。

shell
1bundle gem hello_cre8cre8

gemspecに最低限の情報を編集

bundle gemコマンドで自動生成されたファイルに 指定したgemの名前.gemspec というファイルがあります。
このファイルにはgemに関する情報を記載するのですが、そのままではgemを使用する際にエラーがでるので、
必要最低限の箇所のみ編集します。
具体的にはTODO:を全部消去して、spec.homepageに適当なURLを設定します。

hello_cre8cre8.gemspec
1# coding: utf-8
2lib = File.expand_path('../lib', __FILE__)
3$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4require 'test_gem/version'
5
6Gem::Specification.new do |spec|
7  spec.name          = "test_gem"
8  spec.version       = TestGem::VERSION
9  spec.authors       = ["Takumi Nishimura"]
10  spec.email         = ["takumi@nishimura.io"]
11
12  spec.summary       = %q{ Write a short summary, because Rubygems requires one.}
13  spec.description   = %q{ Write a longer description or delete this line.}
14  spec.homepage      = "https://cre8cre8.com"
15  spec.license       = "MIT"
16
17  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18  # to allow pushing to a single host or delete this section to allow pushing to any host.
19  if spec.respond_to?(:metadata)
20    spec.metadata['allowed_push_host'] = " Set to 'http://mygemserver.com'"
21  else
22    raise "RubyGems 2.0 or newer is required to protect against " \
23      "public gem pushes."
24  end
25
26  spec.files         = `git ls-files -z`.split("\x0").reject do |f|
27    f.match(%r{^(test|spec|features)/})
28  end
29  spec.bindir        = "exe"
30  spec.executables   = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
31  spec.require_paths = ["lib"]
32
33  spec.add_development_dependency "bundler", "~> 1.13"
34  spec.add_development_dependency "rake", "~> 10.0"
35  spec.add_development_dependency "rspec", "~> 3.0"
36end

gem本体のコード作成

きました!ようやくgem本体の作成です!
それでは、お約束のHello Worldでいきましょう。
lib/hello_cre8cre8.rbを開いて編集します。

lib/hello_cre8cre8.rb
1require "test_gem/version"
2
3module HelloCre8cre8
4  def self.hello
5    'Hello World'
6  end
7end

gemが動作するか確認

作成したgemが動作するか確認するため、bundle exec irbを使用して確認してみましょう。

shell
1% bundle exec irb
2irb(main):001:0> require 'hello_cre8cre8'
3=> true
4irb(main):002:0> HelloCre8cre8.hello
5=> "Hello World"
6irb(main):003:0> exit

上記のような出力になった場合成功です。
もし、エラーが発生した場合、gemspecの内容をもう一度チェックしてください。

リリース!!

リリースする際に、gemspecを編集します。
下記の内容の行を削除してください。

hello_cre8cre8.gemspec
1  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
2  # to allow pushing to a single host or delete this section to allow pushing to any host.
3  if spec.respond_to?(:metadata)
4    spec.metadata['allowed_push_host'] = " Set to 'http://mygemserver.com'"
5  else
6    raise "RubyGems 2.0 or newer is required to protect against " \
7      "public gem pushes."
8  end

もし、上記の行を削除し忘れていた場合、リリース時に下記の内容のエラーがでますので注意してください。

shell
1rake aborted!
2ERROR:  While executing gem ... (Gem::CommandLineError)
3    Too many gem names (/Users/nishimura/iwork/articles/cre8cre8.com/29991231-rails-make-gem/hello_cre8cre8/pkg/hello_cre8cre8-0.1.0.gem, to, http://mygemserver.com); please specify only one

それでは、gemのリリースをしてみましょう!
まずは github につけたgemの名前と同一の公開リポジトリを作成します。

gem公開用のgithubリポジトリ作成

githubリポジトリの作成が完了したら、下記のような画面になります。
リポジトリのURLは後ほど利用しますので、コピペかブラウザのタブ開いたままにしておいてください。
gem公開用のリポジトリのURL

また、https://rubygems.org のアカウントも用意します。
作成していない場合は上記のSignUpリンクより作成してください。
gemをリリースするためにはユーザのトークンが必要になりますので、ログイン後、
アカウント編集画面(https://rubygems.org/profile/edit)からコマンドをコピーして実行します。

shell
1% curl -u cre8cre8 https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials; chmod 0600 ~/.gem/credentials
2Enter host password for user 'cre8cre8': [パスワードを入力]
3 % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
4                                Dload  Upload   Total   Spent    Left  Speed
5100    56    0    56    0     0    119      0 --:--:-- --:--:-- --:--:--   119
6%

上記のようになったら無事トークンの取得が完了しています。

それでは準備が完了したら、いよいお待ちかねのリリースです!

shell
1% git add .
2% git commit -m 'Make gem'
3[master (root-commit) 0427fce] Make gem
4 13 files changed, 167 insertions(+)
5 create mode 100644 .gitignore
6 create mode 100644 .travis.yml
7 create mode 100644 Gemfile
8 create mode 100644 LICENSE.txt
9 create mode 100644 README.md
10 create mode 100644 Rakefile
11 create mode 100755 bin/console
12 create mode 100755 bin/setup
13 create mode 100644 hello_cre8cre8.gemspec
14 create mode 100644 lib/hello_cre8cre8.rb
15 create mode 100644 lib/hello_cre8cre8/version.rb
16 create mode 100644 spec/hello_cre8cre8_spec.rb
17 create mode 100644 spec/spec_helper.rb
18% git remote add origin git@github.com:takumiio/hello_cre8cre8.git
19% git push --set-upstream origin master
20% bundle exec rake release
21hello_cre8cre8 0.1.0 built to pkg/hello_cre8cre8-0.1.0.gem.
22Tag v0.1.0 has already been created.
23Pushed hello_cre8cre8 0.1.0 to rubygems.org.

gemの内容をコミットしたあとに、先程作ったgithubリポジトリをpush先に設定し、pushします。
その後、bundle exec rake releaseを実行して、git tagをつけて、rubygemsにgemをアップロードします。

それでは、rubygemsを確認しましょう!

rubygems.orgの公開完了画面

キタ━━━━(゚∀゚)━━━━!!
これで無事gemの公開が完了しました。
いかがでしたでしょうか??
煩わしい手順が少し多い程度で、思ったより公開するのは簡単だったのではないでしょうか??

これを期に自作のgemをたくさんつくって公開してオープンソースを賑やかにしちゃうのもいいですね。
われこそは!!っという方。どしどしリリースしちゃってください(笑)
それでは、お疲れ様でした。

≪ 前の記事
Python3で一時ディレクトリ(tmp/temp)を使う方法
次の記事 ≫
less.jsでCSSを爆速で組むためgulp watchを使う

いいねやコメントを送っていただけると中の人がしっぽ振って大喜びします♪

あなたへのおすすめの記事