opamp_sandoの日記 ...でいいよね

Firefox ブラウザ無料ダウンロード

2012-01-22

jewelerとか使わないでRubyアプリケーションの開発とか

jewelerが最近不調maxなのでそろそろjewelerに頼らないRubyアプリケーションの組み方を考えてみる。
railsじゃないよ。

目標はrakeを使って自動でtestやら色々実行できることとか最終的にgemファイルを作成してrubygems.orgなどにうpロードできるレベル。

ということで早速やってみる


1.作業用ディレクトリとか作る

作業環境はMacOSX Lion... 多分ほかのUNIX系OSでも大丈夫。 Windowsはわからん。
ということでまず作業用ディレクトリ...というかプロジェクトを作る.

$ mkdir myproject 
$ cd myproject

プロジェクト名"myproject"にしようと思う。
ということで上のように新しいディレクトリを作ってプロジェクトのディレクトリとする。

2.gemspecを書いてみようか

gemspecを書けばgemコマンドを使ってgemを生成できる。自分としてはこれを最初に書いていくことにする。
まず以下に自分が実際に作ったプロジェクトで書いたサンプルを示す。コメントでその行や記述についての解説を入れているのでサンプルを参考にgemspecを書いてみよう...
また、gemspecファイル名は "projectname.gemspec" とするといい。

$ vim myproject.gemspec

としてmyproject.gemspecを書いていく。(vimじゃなくて他のエディタでももちろんいいけどうちはvim家なのでvimにする)
とりあえず実際に以下のように書いた。

Gem::Specification.new do |s|
        s.name = 'myproject' # Project Nameを入力する
        s.version = '0.0.1'  # Projectのバージョンを入力する。とりあえず0.0.0とか0.0.1とかしておけばおk 最初はね。
        s.required_ruby_version = '>= 1.9.2' # rubyの要求バージョンを記述する。特にない場合は省略できる。
        s.bindir = 'bin' # bindirを指定する。特にない場合は省略可能。binには普通shellから直接実行するファイルを置く。
        s.executables << 'myproject' # bin以下に入っているスクリプトを指定する。つまりmyprojectというrubyスクリプトは直接シェルから実行することができるということ。 
        s.date = '2012-01-22' #日付 とりあえず今日の日付
        s.summary = %Q{sample project} #プロジェクトの説明
        s.description = %Q{This project is made for sample.} #プロジェクトの詳しい説明
        s.authors = ['opamp'] # 作者の名前。 複数いる場合は ['opamp','sando']
        s.email = 'opampg@gmail.com' # emailアドレス。
        s.files = %W{lib/myproject.rb} # ライブラリ。普通rubyスクリプトからrequireされる。gemに含めるrbファイルを記述
        s.homepage = 'https://....' # homepage
        s.license = "BSD" #ライセンスを記述。 複数ある場合は ['BSD','GPL'] などとする。
#       s.post_install_message = "" # おそらくgem installした特表示するmassage なくても良い。
end


という具合。
binやlibについてもう少し詳しく説明しておくと、bin以下にあるスクリプトコマンドラインから直接呼ばれるもの。
例えば上のgemインストールすると

$ myproject

というコマンドが利用可能になるはず。 gemはこういうものばかりでなく当然ライブラリOnlyのgemも存在するのでそういう場合はこのbin系の記述はしなくてもいい。

libには普通rb拡張子をつけたファイルを配置して他のrubyスクリプトからrequireされる。
gemはこっちが基本な気がするからこの記述を省略する意味はないと思う。

ちなみにこれだけですでにgemは作成できる。

$ gem build myproject.gemspec

して成功すればgemファイルが作成される。失敗すればエラーがでる。

3.続いてbundler

$ gem install bundler

してbundlerをインストールしておく。
bundlerを使うと依存関係を自動解決してくれる。Bundlerはプロジェクトのroot以下にGemfileを作成するといい 以下にサンプルを示す。

$ cat Gemfile 
source "http://rubygems.org"

group :test do
        gem "rspec"
end

まず、sourceでgemリポジトリを指定する。よくわからない人は上のようにしておけばいい。
で、あとは依存関係をひらすら書いていく。 上はgroupを使ってるが使わなくてもいい。

gem "rspec"

と直で書いても問題ない。
http://gembundler.com/
がBundlerのサイトなので、ここに幾つか簡単なsampleがあるので参照するといいかも。

ちなみに、これでbundlerを使って依存関係を解決できるようになったと思う。

$ bundler install
Fetching source index for http://rubygems.org/
Using diff-lcs (1.1.3) 
Using rspec-core (2.8.0) 
Using rspec-expectations (2.8.0) 
Using rspec-mocks (2.8.0) 
Using rspec (2.8.0) 
Using bundler (1.0.21) 
Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.

とプロジェクトのrootでうってみるとrspecとかインストールしてくれると思う。

4.Rakefile

最後にRakefileを書いていく。projectのrootRakefileを作る。

$ vim Rakefile

で、以下にサンプルを示す。


desc "bundle install"
task :bundle_install do
        sh "bundle install"
end

desc "run rspec"
task :rspec do
        # rspecによるテストコマンドなどを記述
end

desc "build gemfile"
task :build_gem do
        sh "gem build myproject.gemspec"
end

rakeは幾つかのTaskという単位に分けて書く。例えば上のサンプルには4つのtask(タスク)が定義されてるのがわかると思う。
defaultはデフォルトで実行されるタスク
で、以下3つの一番上にあるのはbundle installを実行するタスク. 以下のようにして使う (結果も記載)

$ rake bundle_install
bundle install
Using diff-lcs (1.1.3) 
Using rspec-core (2.8.0) 
Using rspec-expectations (2.8.0) 
Using rspec-mocks (2.8.0) 
Using rspec (2.8.0) 
Using bundler (1.0.21) 
Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.

見たら分るように

$ bundle install

と等価になっている。rakeのbundle_installタスクの中で

sh "bundle install"

とあるが、これがその働きをしている。 シェルにコマンドを渡すことができる。

同様に他2つのタスクも定義した。(rspecは省略したrspecによるテストなんかはまたの機会に)

一番最後のタスクgemを作成するタスク。普通rakerubyで使うときはこれを使うのかな。タスクの名前はちょっと王道に沿わないかもしれないけど...まあいいや。


これで

$ rake -T
rake build_gem       # build gemfile
rake bundle_install  # bundle install
rake rspec           # run rspec

と、するとタスクの一覧をみることができる。
で、

$ rake build_gem

すると

$ gem build myproject.gemspec

が実行されるのと等価でgemファイルができる。

できた感じ?

5.RubyGems.orgにpushしてみたり

RubyGems.org | your community gem hostにPushするには、まずRubyGems.orgにアカウントをとっておく必要がある。
ということでアカウントを予め適当にとっておく。gemspecで設定したauthorsとrubygemsアカウント名は同じ名前にしたほうがいいと思う。

で、~/.gem/credentialsに以下のように記述する

:rubygems_api_key: APIKEY

APIKEYの部分には自分のAPIキーを記述する。
APIキーは
f:id:opamp_sando:20120122123725p:image
の丸をつけた部分のページを見れば載ってる。

で、ここまでできたらあとは

$ gem push gemfilepath.gem

とする。gemfileのpathをgem pushコマンドに渡せばおk 今回の場合

$ gem push myproject.gem

かなー?

最後に

最後に参考にしたサイトなんかを貼っていく。

http://guides.rubygems.org/

http://gembundler.com/

http://guides.rubygems.org/command-reference/

とかかな。

rakeなんかはきっともっとすごい使い方ができる...と思う。今日は超簡単に書いただけだけどね。
とりあえずそんな感じ。

さくさく 2012/01/22 17:16 $ bundle gem my_new_gem とか。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/opamp_sando/20120122/1327200686