hoe を使ってみました

最近リリース作業が面倒になってきたので、より気軽にリリースができるよう hoe を導入しようと思います。そうすればきっと頻繁にリリースする気にもなるはず。newgem なんかもありますが、まずはシンプルに行ってみます。

  • hoe をインストール
% sudo gem install hoe --include-dependencies

パッケージを新規に登録したり、gem ファイルをアップロードするのには、rubyforge gem を利用しているのでまずはそっちを確認します。
setup コマンドを実行するとホームディレクトリ以下に .rubyforge/user-config.yml ができているので、rubyforge.org のユーザーアカウントとパスワードを記入しておきます。

% rubyforge setup

ユーザー情報を与えたら、設定情報を自動取得します。以下のように config コマンドで、rubyforge.org に存在するプロジェクトのリストを漁って、必要な ID を取り出してくれます。取り出されたものは、~/.rubyforge/auto-config.yml を見ればわかります。とくに意識して使うことはないでしょう。rubyforge.org の URL にあらわれる諸々の数字たちです。

% rubyforge config
Getting username
Fetching 2 projects
Updating ap4r


で、ログインします。これでクッキーをキャッシュしてのちの操作に備えます。

% rubyforge login
/usr/local/lib/ruby/gems/1.8/gems/rubyforge-0.4.2/lib/http-access2.rb:1087: warning: using default DH parameters.
/usr/local/lib/ruby/1.8/openssl/buffering.rb:178: warning: SSL session is not started yet.
/usr/local/lib/ruby/1.8/openssl/buffering.rb:35: warning: SSL session is not started yet.at depth 0 - 18: self signed certificate
/usr/local/lib/ruby/gems/1.8/gems/rubyforge-0.4.2/lib/http-access2/cookie.rb:185: warning: 2 digits year is used
/usr/local/lib/ruby/gems/1.8/gems/rubyforge-0.4.2/lib/rubyforge.rb:149: warning: potentially failed login using username:password


プロキシ越しの場合は、環境変数「HTTP_PROXY」にセットしておけば通ります。小文字だと信じきっていてしばらく悩みました...。 (^^;
上記のようにいろいろ警告がでましたが、とりえず create_package はできました。ただ、ファイルのアップロードをしようとすると、Internal Server Error になってしまうのでここらあたりの問題はもう少し考えてみます。たぶんプロキシ越しじゃなければ大丈夫な気もします。

追記: プロキシ越しじゃない場合は、すんなりファイルのアップロードもできました。



create_package や add_release をはじめ、以下のコマンドが実行できます。

% rubyforge --help
  ...
  create_package(group_id, package_name)
    creates the named package under the specified group.

    example :
      rubyforge create_package 1024 traits
      rubyforge login && rubyforge create_package codeforpeople.com traits

  add_release(group_id, package_id, release_name, userfile)
    release a file as release_name under the specified group_id and package_id.

    example :
      rubyforge add_release codeforpeople.com traits 0.8.0 traits-0.8.0.gem
      rubyforge add_release codeforpeople.com traits 0.8.0 traits-0.8.0.tgz
      rubyforge add_release 1024 1242 0.8.0 traits-0.8.0.gem
      rubyforge login && rubyforge add_release 1024 1242 0.8.0 traits-0.8.0.gem

 add_file(group_id, package_id, release_id, userfile)
  ...
  delete_package(group_id, package_name)
  ...




  • gem プロジェクトを作成


sow コマンドを実行します。
以下で FIX と書かれている部分を適当に修正します。ちょっと親切ですね。

% sow ap4r
creating project ap4r
... done, now go fix all occurances of 'FIX'

  ap4r/Rakefile:9:  # p.author = 'FIX'
  ap4r/Rakefile:10:  # p.email = 'FIX'
  ap4r/Rakefile:11:  # p.summary = 'FIX'
  ap4r/README.txt:2:    by FIX (your name)
  ap4r/README.txt:3:    FIX (url)
  ap4r/README.txt:7:FIX (describe your package)
  ap4r/README.txt:11:* FIX (list of features or problems)
  ap4r/README.txt:15:  FIX (code sample of usage)
  ap4r/README.txt:19:* FIX (list of requirements)
  ap4r/README.txt:23:* FIX (sudo gem install, anything else)
  ap4r/README.txt:29:Copyright (c) 2007 FIX


生成されたファイル/ディレクトリは以下です。

% ls -l
total 40
-rw-r--r--   1 kiwamu  kiwamu    60  6 18 18:18 History.txt
-rw-r--r--   1 kiwamu  kiwamu    83  6 18 18:18 Manifest.txt
-rw-r--r--   1 kiwamu  kiwamu  1423  6 18 18:34 README.txt
-rw-r--r--   1 kiwamu  kiwamu   508  6 18 18:21 Rakefile
drwxr-xr-x   3 kiwamu  kiwamu   102  6 18 18:18 bin
drwxr-xr-x   3 kiwamu  kiwamu   102  6 18 18:18 lib
drwxr-xr-x   3 kiwamu  kiwamu   102  6 18 18:18 test


タスクの一覧をみてみると、なにやら素敵そうな名前がいっぱい見つかります♪

% rake -T
rake announce         # Generate email announcement file and post to rubyforge.
rake audit            # Run ZenTest against the package
rake check_manifest   # Verify the manifest
rake clean            # Clean up all the extras
rake clobber_docs     # Remove rdoc products
rake clobber_package  # Remove package products
rake config_hoe       # Create a fresh ~/.hoerc file
rake debug_gem        # Show information about the gem.
rake default          # Run the default tasks
rake docs             # Build the docs HTML Files
rake email            # Generate email announcement file.
rake gem              # Build the gem file ap4r-1.0.0.gem
rake install          # Install the package. Uses PREFIX and RUBYLIB
rake install_gem      # Install the package as a gem
rake multi            # Run the test suite using multiruby
rake package          # Build all the packages
rake post_blog        # Post announcement to blog.
rake post_news        # Post announcement to rubyforge.
rake publish_docs     # Publish RDoc to RubyForge
rake redocs           # Force a rebuild of the RDOC files
rake release          # Package and upload the release to rubyforge.
rake repackage        # Force a rebuild of the package files
rake ridocs           # Generate ri locally for testing
rake test             # Run the test suite. Use FILTER to add to the command line.
rake test_deps        # Show which test files fail when run alone.
rake uninstall        # Uninstall the package.

ちなみに、開発環境にもともとある ap4r ディレクリを sow コマンドで上書きしようと思ったのですが、実行できなかったので別な場所でコマンドを実行してからぺたっとそれらをコピーしました。

AP4R では 「README」と「CHANGELOG」にしていたので、Rakefile 以外で同じファイル名のものはありませんでした。
最初はそれらをそのまま使おうとしてましたが、いろいろ rake タスクを試しているうちに、RDoc の生成時に困ることがわかったので、素直に sow で生成される「README.txt」と「History.txt」を利用することにしました。形式はほとんど同じだったのにほぼコピペで対応完了。


何が問題だったかというと、hoe の用意している RDoc 生成タスクでは、「README.txt」と「History.txt」を RDoc に加えるようべたにソースに書いてあるので、それ以外のファイル名にしてしまうと RDoc から消えてしまうのです。また、ページのタイトルもほぼ決めうちです。外から設定する口は用意されていないようです。
rake を素で使った場合には、rdoc_options で --main だとか --title だとか --line-numbers なんかが設定できますが、hoe ではここらへんが隠蔽されちゃっているので、ちょっと注意が必要かもしれません。



次に Manifest.txt をちゃんと書きます。以下のコマンドでローカルのファイルと記載内容の差分がでますので、うまく利用して gem パッケージに含めたいファイルをすべて記載するようにします。ちなみに /\.svn|tmp$|CVS/ に一致するファイルは差分の表示にでてきません。
ここのメンテが少しめんどくさそう...。

% rake check_manifest


追記: というわけで、Manifest.txt を作成するタスクは書いてしまいました。基本的には、.svn などを除いたものすべてなので素直にカレント以下のファイルを拾って書き出すだけです。これでメンテの手間も解消されると思います。

% rake create_manifest


あとは、Rakefile を自分のプロジェクト用に書き直すだけです。hoe の RDoc で Attributes を参考にするといいでしょう。

  • seattlerb's hoe-1.2.1 Documentation

http://seattlerb.rubyforge.org/hoe/


ちなみに、AP4R ではこんな感じにしてみました。一部省略していますが、ほぼそのままです。
description なんかは「README.txt」の内容を引っ張ってくることもできます。今回は単に手抜き。

require 'rubygems'
require 'hoe'
require File.join(File.dirname(__FILE__), 'lib/ap4r', 'version')

...

Hoe.new('ap4r', Ap4r::VERSION::STRING) do |p|
  p.author = ['...']
  p.changes = p.paragraphs_of('History.txt', 1..2).join("\n\n")
  #p.clean_globs = 
  p.description = <<-EOF
    Asynchronous Processing for Ruby.
  EOF
  p.email = ['...']

  p.extra_deps << ['reliable-msg', '=1.1.0']
  p.extra_deps << ['activesupport']
  p.extra_deps << ['mongrel']
  p.extra_deps << ['rake']
  p.extra_deps << ['hoe']

  p.name = 'ap4r'
  p.need_tar = false
  p.need_zip = false
  #p.rdoc_pattern =
  #p.remote_rdoc_dir = 
  #p.rsync = 
  p.rubyforge_name = 'ap4r'
  #p.spec_extra = 
  p.summary = 'Asynchronous Processing for Ruby.'
  p.test_globs = 'spec/**/*_spec.rb'
  p.url = 'http://ap4r.rubyforge.org/wiki/wiki.pl?HomePage'
  p.version = Ap4r::VERSION::STRING
end


これで rake gem すれば OK です。
サンプルアプリのリリース用のカスタムタスクなんかも Rakefile に加えていきましたが、以前に比べだいぶすっきりした感じになりました♪



気楽なリリースに一歩近づいたかなw


  • 参考

http://nubyonrails.com/articles/tutorial-publishing-rubygems-with-hoe

  • seattlerb's hoe-1.2.1 Documentation

http://seattlerb.rubyforge.org/hoe/