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のrootにRakefileを作る。
$ 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を作成するタスク。普通rakeをrubyで使うときはこれを使うのかな。タスクの名前はちょっと王道に沿わないかもしれないけど...まあいいや。
これで
$ 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キーは
の丸をつけた部分のページを見れば載ってる。
で、ここまでできたらあとは
$ 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なんかはきっともっとすごい使い方ができる...と思う。今日は超簡単に書いただけだけどね。
とりあえずそんな感じ。
- 30 http://b.hatena.ne.jp/hotentry/it
- 29 http://reader.livedoor.com/reader/
- 14 http://jetsli.de/crawler
- 12 http://b.hatena.ne.jp/
- 12 http://b.hatena.ne.jp/entrylist/it
- 10 http://www.google.co.jp/reader/view/
- 9 http://b.hatena.ne.jp/entrylist
- 8 http://www.google.com/reader/view/
- 8 http://www.ig.gmodules.com/gadgets/ifr?exp_rpc_js=1&exp_track_js=1&url=http://choichoi.sakura.ne.jp/hatena_bookmark.xml&container=ig&view=default&lang=ja&country=JP&sanitize=0&v=8521b03aa7802eee&parent=http://www.google.co.jp&libs=core:core.io:cor
- 7 http://bit.ly/A8enKZ
