#gemとはなんじゃその②
##はじめに
前回の記事でgemの簡単なイメージが湧きました。簡単なgemの使い方も学びました。
じゃあ今回は自分で簡単なgemを作ってみましょう。
##環境
(今まで開発環境のこと書いてなかったです...ごめんなさい)
Ruby 2.3.1
bundler 1.14.6
##まずは雛形を作る
適当にディレクトリを作ってそこに作ってみます。bundler
を使えば雛形をコマンド一つて作ってくれます。gemの名前はこちらを参考にしてください。今回は適当にtestgem
としてます。
途中でtestではどのgem
を使うか、MITは必要か、code of conductは必要か聞かれるので答えましょう。
testはrspec
を用い、残りの二つは必要と答えました。MITとcode of conductはオープンソースライセンスと行動規範のことです。作ったgemを公開するなら必要かなと思います。
作成されたものは下記のとおりです。
$ ls -a
. .git .rspec CODE_OF_CONDUCT.md
LICENSE.txt Rakefile lib testgem.gemspec
.. .gitignore .travis.yml Gemfile
README.md bin spec
git init
も自動でやってくれるみたいですね。LICENSE.txt
、CODE_OF_CONDUCT.md
は先ほど回答したもの。README.md
仕様書も作成されます。前回説明したGemfile
もあります。gemを作成する場合、gemの依存関係はgemspec
というファイルに記載すべきだそうです。なのでこの段階でGemfile
にはgemspec
を読み込むように書いてあります。
lib
の中にはtestgem.rb
とtestgem/version.rb
が入ってます。
このtestgem.rb
がgemのコードを定義する主なファイルです。
##コード書いてく前に、テスト書いてこう
先のテストにどのgem使う?、に対してrspec
と回答したのでgemspec
に開発環境でrspec
を使うように記述されています。
spec.add_development_dependency "rspec", "~> 3.0"
ではインストールしましょう。と思ったら、怒られた。
$ bundle install
You have one or more invalid gemspecs that need to be fixed.
The gemspec at /Users/hicom.games/works/asobiba/gemtest/testgem/testgem.gemspec is not valid. Please fix this gemspec.
The validation error was '"FIXME" or "TODO" is not a description'
gemspec
の必須記入項目が書かれてねえから書いてくれとのこと。
testなので適当に埋めました。下記の部分です。
Gem::Specification.new do |spec|
spec.name = "testgem"
spec.version = Testgem::VERSION
spec.authors = ["kamo"]
spec.email = ["kamo@gmail.com"]
spec.summary = %q{this gem is test. by kamo}
spec.description = %q{this gem is test. by kamo}
spec.homepage = ""
spec.license = "MIT"
#~~~~~~~~~~~~~~~略~~~~~~~~~~~~~~~~~~~~~~
end
これでインストールできます。$ bundle install
します。
インストールできたらテストを書きましょう。今回のtestgemではありきたりなHello!
が出力されるサンプルgemが作れればいいので、テストも簡単です。
describe Testgem::Greeting do
it "hello" do
expect(Testgem::Greeting.greet).to eql("Hello!")
end
end
コードは基本的にlib/testgem/配下に置いてそれをtestgem.rbで読み込む形にしましょう。
module Testgem
class Greeting
def self.greet
"hello"
end
end
end
簡単なこんにちわコードです。後はtestgem.rb
で読み込みさらに、そのtestgem.rb
をspec/testgem_spec.rb
で読み込むようにします。
require 'testgem/greeting'
require 'testgem'
これでプログラムを実行できます。早速テストしてみましょう。
$ bundle exec rspec spec
Testgem
hello
Finished in 0.00368 seconds (files took 0.0998 seconds to load)
1 example, 0 failures
問題なしですね。
##ビルドして公開してみる
今回公開するつもりなかったんでtestgemなんて名前つけたせいで、すでにあるgemと名前が被りリリースできませんでした。
以下、一応リリースの手順です。
まず作ったgemはgithubのリポジトリにあげといてください。
次に公開するためにRrubyGems.org
でアカウントを作り、https://rubygems.org/profile/edit でAPI keyを取得します。
下記のコマンドを叩いてログインします。
curl -u お名前 https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials; chmod 0600 ~/.gem/credentials
gemをbuildします
$ rake build
gemの名前 0.1.1 built to pkg/testgem-0.1.1.gem.
リリースします。
$ rake release
これで完了。gem install gemの名前
でインストールできます。
##まとめ
いつか自作のgem作ってみたいですね。頑張ります。
##参考にしたの
【Ruby】gemの作り方から公開まで
https://qiita.com/9sako6/items/72994b8b1c00af4e61fe
guides.rubygems.org
https://guides.rubygems.org/make-your-own-gem/
Developing a RubyGem using Bundler
https://bundler.io/v1.13/guides/creating_gem
gemspecとGemfileの役割をはっきりさせておく
http://sanemat.github.io/archives/langturn.com-translations-33/
Rubyの名前空間とレキシカルスコープについて簡潔に説明する。
https://qiita.com/Drumato/items/ec889d0c3b4b94c67120
gemに投稿してみた
https://qiita.com/siukaido/items/53571e507e2abe592a7f