(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
でも取得できる。
ディレクトリ構成
- 製品トップディレクトリ
- ファイル
- 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 (ドキュメント)
 
 - lib (rubyライブラリ)
 
 - ファイル
 
インストール
- gem を使わず、システムにインストールするのは rake nongeminstall とする (名前は要検討)
 - rake install とすると、ローカルに gem を作成して、その gem をインストールする
- bundler の仕様なので、bundler を使わないで nongeminstall を install にするか?
- 世の中とそれなりに振る舞いを合わせておいたほうがよいだろう
 
 
 - 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')
    
キーワード:
参照: