チュートリアル

このページでは、実際のPackngaのRakefileを参考に、Packngaの使用方法を紹介します。

インストール

PackngaはRubygemsからインストールできます。

% sudo gem install packnga

タスク生成の準備

Packngaを使用する前に、Gem::Specification.newメソッドにて spec を作成します。この spec を用いてPackngaはタスクを生成します。次にその例を示します。

Gem::Specification.newメソッドを用いたspecの作成

ここではgemspecファイルにてGem::Specification.newメソッドを使ってspecを作成する方法を紹介します。 次の例を見てください。

version = Packnga::VERSION.dup

readme_path = File.join(base_dir, "README.textile")
entries = File.read(readme_path).split(/^h2\.\s(.*)$/)
entry = lambda do |entry_title|
  entries[entries.index(entry_title) + 1]
end

authors = []
emails = []
entry.call("Authors").each_line do |line|
  if /\*\s*(.+)\s<([^<>]*)>$/ =~ line
    authors << $1
    emails << $2
  end
end

clean_white_space = lambda do |entry|
  entry.gsub(/(\A\n+|\n+\z)/, '') + "\n"
end
description = clean_white_space.call(entry.call("Description"))
summary, description = description.split(/\n\n+/, 2)

Gem::Specification.new do |s|
  s.name = "packnga"
  s.version = version
  s.authors = authors
  s.email = emails
  s.summary = summary
  s.description = description

  s.extra_rdoc_files = ["README.textile"]
  s.files = ["README.textile", "Rakefile", "Gemfile"]
  Dir.chdir(base_dir) do
    s.files += Dir.glob("lib/**/*.rb")
    s.files += Dir.glob("doc/text/*.*")
  end

  s.homepage = "http://ranguba.org/"
  s.licenses = ["LGPLv2"]
  s.require_paths = ["lib"]

  s.add_runtime_dependency("rake")
  s.add_runtime_dependency("yard")
  s.add_runtime_dependency("gettext")
  s.add_development_dependency("test-unit")
  s.add_development_dependency("test-unit-notify")
  s.add_development_dependency("bundler")
  s.add_development_dependency("RedCloth")
end

次に、Rakefileでgemspecファイルで作成したspecを取得します。 次のようなコードをRakefileに書くとspecを取得できます。

helper = Bundler::GemHelper.new(base_dir)
helper.install
spec = helper.gemspec

Jeweler::Task.newによって生成されるオブジェクト

RakefileでJeweler::Tasks.newメソッドを使ってspecを作成する場合は、次の例を見てください。 この例のコードはPackngaの以前のRakefileに書かれていたものです。

spec = nil
Jeweler::Tasks.new do |_spec|
  spec = _spec
  spec.name = "packnga"
  spec.version = version
  spec.homepage = "http://ranguba.org/"
  spec.authors = ["Haruka Yoshihara", "Kouhei Sutou"]
  spec.email = ["yoshihara@clear-code.com", "kou@clear-code.com"]
  entries = File.read("README.textile").split(/^h2\.\s(.*)$/)
  description = cleanup_white_space(entries[entries.index("Description") + 1])
  spec.summary, spec.description, = description.split(/\n\n+/, 3)
  spec.license = "LGPLv2"
  spec.files = FileList["lib/**/*.rb",
                        "Rakefile",
                        "README.textile",
                        "Gemfile",
                        "doc/text/**"]
  spec.test_files = FileList["test/**/*.rb"]
end

タスクの生成

Packngaでは、それぞれのタスクを担当するクラスがあります。Packngaのクラスと、そのクラスで定義できるタスクは次のようになります。

Packnga::DocumentTask
リファレンスなどのドキュメントを生成する関係のタスクを設定・定義します。YARDによるドキュメント生成や、poファイルの生成、そのpoファイルによるドキュメントの翻訳などを行うタスクを定義します。
Packnga::ReleaseTask
リファレンスやパッケージをアップロードしたり、そこまでの準備を行うタスクを定義します。gitへのリリースのタグを打ったり、gemをユーザインストールしてテストを実行するためのタスクを定義します。

それぞれ、タスクを生成するためには次のようにします。


Packnga::DocumentTask.new(spec)
Packnga::ReleaseTask.new(spec)

ドキュメントのパスを設定する

DocumentTaskやReleaseTaskのオブジェクトを生成する際に、ブロックにて変更できるパラメータがあります。 ここでは例として、ドキュメントのベースとなるようなディレクトリの設定を行います。このディレクトリの下に、ドキュメント関係のファイルが生成されるようになります。この値を独自に設定したい場合には次のようにRakefileに記述します。

また、このベースディレクトリの値は両方のクラスにて同じものを指定してください。


Packnga::DocumentTask.new(spec) do |task|
  task.base_dir = "doc/"
end

Packnga::ReleaseTask.new(spec) do |task|
  task.base_dir = "doc/"
end

他にも設定できるパラメータがあります。詳しくはリファレンスマニュアルをご覧ください。