(Others) Dennou Ruby 製品テンプレート

はじめに

Dennou Ruby 製品において、共通化できる部分は共通化することで、 ノウハウの共有および、 製品作成・バイナリパッケージ作成の手間軽減が可能である。 現在は、各製品ごとにバラバラであるため、 まずは共通の仕様を決めることが当面の目的である。

サンプルとして、

http://ruby.gfd-dennou.org/products/hello/

を用意している。

git clone ssh://dennou-k.gfd-dennou.org/GFD_Dennou_Club/ftp/arch/ruby/products/hello/hello.git

でも取得できる。

共有化できるもの

  • ディレクトリ構成
  • インストール方法
  • gem, tar 作成方法

例の注釈

以下では、製品が NumRu::A::B クラス (or モジュール) を提供しているとする

ディレクトリ構成

  • 製品トップディレクトリ
    • ファイル
      • README (or README.rdoc)
      • LICENSE.txt
      • Rakefile
      • gemspec ?
      • Gemfile ?
    • ディレクトリ
      • lib (rubyライブラリ)
        • 下にモジュール構成に合わせてディレクトリを掘る
          • lib/numru/a/b.rb
          • lib/numru/a/b/hoge.rb
      • ext (拡張ライブラリ)
        • 下にモジュール構成に合わせてディレクトリを掘る
          • ext/numru/a/hoge.c
        • extconf.rb も掘ったディレクトリの下に置く
          • ext/numru/a/extconf.rb
      • bin (実行スクリプト)
      • test (テスト)
        • test*.rb という名前でテスト用ファイルを置く
      • samples (サンプル)
      • doc (ドキュメント)

インストール

  • gem を使わず、システムにインストールするのは rake nongeminstall とする (名前は要検討)
  • rake install とすると、ローカルに gem を作成して、その gem をインストールする
    • bundler の仕様なので、bundler を使わないで nongeminstall を install にするか?
      • 世の中とそれなりに振る舞いを合わせておいたほうがよいだろう

Gem

  • スペックを name.gemspec ファイルにわかるか、 Rakefile に書くか
    • 分けたほうがそれぞれ変更しやすいのでは?
  • rake build で作成
    • build という名前は bundler の仕様

source tar ball

  • rake package で作成
    • package という名前要検討

その他

  • lib/numru/a/b/ ディレクトリ以下に、version.rb を用意し、 NumRu::A::B::VERSION 定数を定義するようにする
    • gem, tarball 作成でそのバージョンを読む
    • 本体(b.rb等)に定義すると、そのためだけにライブラリすべて読み込む必要がある
module NumRu
  module A
    class B
      VERSION = "0.0.0"
    end
  end
end

Rakefile

  • 拡張ライブラリのコンパイル、インストール、gem 作成、source tar ball, test 実行のタスクを定義する

テンプレート案

# -*- mode: ruby; coding: utf-8 -*-
require 'rake/packagetask'
require 'rake/clean'
begin
  require 'bundler/gem_tasks'
rescue LoadError
  puts "If you want to create gem package, You should install bundler"
  require './lib/numru/a/b/version.rb'
end

def version
  NumRu::A::B::VERSION
end

destdir = ENV["DESTDIR"] || ""
sitelibdir = ENV["SITELIBDIR"] || RbConfig::CONFIG["sitelibdir"]

extdir = "ext/numru/a"

Rake::PackageTask.new('name', "#{version}") do |t|
  t.need_tar_gz = true
  t.package_files.include `git ls-files`.split("\n")
end

task :default => :test
task :build => :package

task :test => :ext do
  FileList['test/test*.rb'].each do |f|
    ruby "-Ilib:ext #{f}"
  end
end

desc "Build extension library"
task :ext => "#{extdir}/gtk.so"
file "#{extdir}/b.so" => Dir.glob("#{extdir}/*{.rb,.c}") do
  Dir.chdir(extdir) do
    ruby "extconf.rb"
    sh "make"
  end
end

desc "Install without gem"
task :nongeminstall => :ext do
  prefix = File.join(destdir, sitelibdir)
  FileList['lib/**/*.rb'].each do |f|
    dst = File.join(prefix, File.dirname(f.sub(/\Alib\//,"")))
    mkdir_p dst
    install f, dst, :mode => 0644
  end
  Dir.chdir(extdir) do
    sh "make install DESTDIR=#{destdir}"
  end
end

CLEAN.include('ext/**/*{.o,.log,.so}')
CLEAN.include('ext/**/Makefile')
更新日時:2013/04/02 21:29:54
キーワード:
参照: