(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')
キーワード:
参照: