Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
23
Help us understand the problem. What is going on with this article?
@chamao

RubyGemsの作り方

More than 1 year has passed since last update.

1: アップデート

# gem自身のアップデート
gem update --system
# bundlerインストール済の場合はアップデート
$ gem update bundler
$ bundler --version

2: ひな形の作成

今回は、ナイーブベイズ(Naive Bayes)に関するgemを作ります。
ディレクトリを前もって作成する必要はありません。

$ bundle gem  jnb_classifier

作成時に何もオプションを指定しなければ、対話形式に以下のことが聞かれます。
・テストは Rspec?  Minitest?
・MITライセンスで良いいよね?
・code of conduct に関するファイルを生成する?

最後の質問に関してはこちらを参照して下さい。
Contributor Code of Conduct

以下のファイルが生成されます。

$ cd /nb_classifier
$ ls
CODE_OF_CONDUCT.md  Gemfile  LICENSE.txt  README.md  Rakefile  bin  lib  jnb_classifier.gemspec  spec

3: gem_name.gemspec の修正

このファイルの中に"TODO"というワードが含まれているとbundleできない仕組みなので、少なくとも以下の点は書き直す。

jnb_classifier.gemspec

spec.summary       = %q{jnb_classifier helps you classify samples by Naive Bayes.}
spec.description   = %q{I will write this section when I finish creating this gem}
spec.homepage      = "https://github.com/your_github_acoount/"

4: 実際のコードを記述する

vim lib/jnb_classifier.rb

require 'jnb_classifier/version'
require 'natto'

module bClassifier
  # ここにコードを記述します。
end

5:Bundle

今回は、nattoというgemを使うので、jnb_classifier.gemspecに追記します。

spec.add_runtime_dependency `natto`

そして、bundle

$ bundle install --path .bundle

--path .bundleというオプションを指定することで、gemパッケージのインストールの影響をこのディレクトリにとどめています。

※.gemspecにrubyの内部モジュールを指定すると失敗するので注意(open-uriとか)

以下のような表示がされます。

Using rake 10.5.0
Using bundler 1.16.0
Using diff-lcs 1.3
Using nb_classifier 0.1.0 from source at `.`

rakebundlerdiff-lcsの3つはデフォルトのgemで、開発のために必要なdevelopment_dependencyとして、jnb_classifier.gemspecに定義されています。

  spec.add_development_dependency "bundler", "~> 1.16"
  spec.add_development_dependency "rake", "~> 10.0"
  spec.add_development_dependency "rspec", "~> 3.0"

6:使ってみる

nb_classifierディレクトリ下に、occult.txtcosplay.txtがあるとします。

$ bundle exec irb
$ require 'jnb_classifier'
$ doc_occult =  JnbClassifier::Document.new('occult','occult.txt')     # 単語頻度の数え上げ(hash)
$ doc_cosplay =  JnbClassifier::Document.new('cosplay','cosplay.txt')  
$ jnb = JnbClassifier::Classifier.new
$ jnb.learn(doc_occult)     # 学習①
$ jnb.learn(doc_cosplay)    # 学習②
$ jnb.classify({"ヤクザ"=>1, "人"=>1,"彼女"=>1})              # 分類(結果)

期待通りの動作を確認できたので、gemをビルドして公開します。

7:ビルド

jnb_classifierディレクトリ直下で行います。

$ rake build

パーフェクト Ruby より抜粋

ビルドを行うと作業ディレクトリ直下にpkgディレクトリが作成され、その下にgem_name.gemというファイル名でビルドされたgemパッケージのバイナリファイルが作成されます。

$  gem install pkg/jnb_classifier-0.1.0.gem 

あとは、ローカル環境ではrequire jnb_classifier することで自由に使えます。

今回は、buid => install という風に行いましたが以下のコマンドで同様のことを行えます。

$ rake install

以下のようにrubyのファイルで作成することができます。

test.rb

require 'jnb_classifier'

file_cosplay = "cosplay.txt"
doc_cosplay = JnbClassifier::Document.new("cosplay", file_cosplay)

file_occult = "occult.txt"
doc_occult = JnbClassifier::Document.new("occult", file_occult)

# 学習
yahoo_cat = JnbClassifier::Classifier.new
yahoo_cat.learn(doc_cosplay)
yahoo_cat.learn(doc_occult)
yahoo_cat.learn(doc_occult)
# 分類
test_hash = {"彼女"=>1, "コスプレ"=>1, "伝説"=>1}
puts  yahoo_cat.classify(test_hash)
$ ruby test.rb

8: 修正(ビルド後)

ビルドした後にいろいろ修正したい点が出てきた場合についてです。
今回はクラスの名前NaivBayseを初めいろいろ修正したい点が出てきたので以下のプロセスで修正しました。

①作業ディレクトリに戻り修正する
②rake install

とても簡単にできますね。

9: 公開

GitHubと連携して管理するようなので以下のことは前提となります
・GitHubアカウントを持っていること
・magnetohydrodynamical
・GitHub用にSSHキーの設定を行う:GitHubへssh接続する

①rubygems.orgのアカウントを取得
作ったgemをリリースするまで
1.「sign up」からアカウントを作成
2. アカウント作成後、Edit profile(https://rubygems.org/profile/edit) に移動
3. APIアクセス用の鍵を作成(以下のコマンドが用意されている)

コマンド

curl -u your_name https://rubygems.org/api/v1/api_key.yaml > ~/.gem/credentials; chmod 0600 ~/.gem/credentials

②GitHub上のリモートリポジトリの設定(たぶん必要)
現在の作業用でじレクトリをリモートリポジトリに反映させます
Githubに新規リポジトリ(Repository)を作成する

$ git init
$ git add
$ git commit -m "my first commit"
$ git remote add origin https://github.com/xxxx/sample-repository.git
$ git push origin master

③リリース
あとは、releaseするだけ。

$ bundle exec rake release

おしまい。

ハマりどころ

自分の場合releaseがうまくいかなくって、だいぶハマった。
結論としてはapache logをパースするgemを作ってrubygems.orgに公開してみたと全く同じ状況におちいってしまった。

$ bundle exec rake releaseが終わらねぇ・・

$ cat ~/.gem/credentials
HTTP Basic: Access denied.

となっていた。上記のcurlコマンドが上手く行かなかったらしい。
手動で以下のように設定(APIキーはこのページ:https://rubygems.org/profile/edit)。

~/.gem/credentials

:rubygems_api_key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

頑張りどころ

README.md を書こう

書き方など参照
わかりやすい README 駆動開発

エディタもある便利
Linux Mint 18: マークダウンエディター「Ghostwriter」

参照

RubyGemはめっちゃ簡単に作れる! 

23
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
chamao

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
23
Help us understand the problem. What is going on with this article?