履歴
概要
RubyGemsパッケージの作成手順。
全部gemで入る。
GPhys を例に説明する。 基本的には、プロジェクトフォルダ以下につぎのように適切な Rakefile, gphys.gemspec, Gemfile ファイルなどを置くだけでよい。
gemの作成は、全部設定したあとに、
$ rake build
で、pkg/ 以下に gphys-<バージョン番号>.gem ができる。
RubyGems.orgへの発行は、RubyGems.orgにアカウントを作成したあと、API keyを適切に設定しておき、
$ rake release
とすると、version.rb に記述しているバージョン番号で git のタグを打ってからRubyGems.org へリリースする。
プロジェクトフォルダ以下には、基本的につぎのようにファイルを配置する
gemパッケージのバージョンを記述しているrubyスクリプト。 今回は、lib/numru/gphys/ に置く。ライブラリファイルに直接書いても良い。
% cat lib/numru/gphys/version.rb module NumRu class GPhys VERSION = "1.4.3" end end
% cat Gemfile source 'https://rubygems.org' # Specify your gem's dependencies in gphys.gemspec gemspec
一番単純なのは次のとおり:
# -* coding: utf-8 -*- require "bundler/gem_tasks"
rake compilerを使用した書き方は次のとおり:
# -* coding: utf-8 -*- require 'rake/testtask' require 'rake/extensiontask' require 'rake/packagetask' begin require 'bundler/gem_tasks' rescue LoadError puts 'If you want to create gem, You must install Bundler' end require './lib/numru/gphys/version.rb' def version NumRu::GPhys::VERSION end task :default => :test task :test => :compile Rake::TestTask.new do |t| t.libs << 'lib' << 'test' t.test_files = FileList['test/test_*.rb'].exclude('test/test_assoccoords.rb') end Rake::ExtensionTask.new do |ext| ext.name = 'gphys_ext' ext.ext_dir = 'ext/numru/gphys' ext.lib_dir = 'lib/numru' end Rake::PackageTask.new('gphys', "#{version}") do |t| t.need_tar_gz = true t.package_files.include `git ls-files`.split("\n") end
gphys.gemspecファイルの全体はこちら。 詳細については<URL:http://guides.rubygems.org/specification-reference/>を参照。
細かく説明すると、
1) libファイルの場所を指定
# coding: utf-8 lib = File.expand_path('../lib', __FILE__) $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
2) gem パッケージのバージョン名を書いているファイルを読み込み
require 'numru/gphys/version'
3) gem パッケージの詳細をGem::Specification.new do .. end 間で指定
3-1) 基本設定
Gem::Specification.new do |spec| spec.name = "gphys" spec.version = NumRu::GPhys::VERSION spec.authors = ["Takeshi Horinouchi", "Ryo Mizuta",\ "Daisuke Tsukahara", "Seiya Nishizawa", "Shin-ichi Takehiro"] spec.email = ["eriko@gfd-dennou.org"] spec.summary = %q{A multi-purpose class to handle Gridded Physical quantities} spec.description = %q{Comprehensive library for self-descriptive gridded physical data (in NetCDF, GrADS, or on memory) with graphics. This version works with Ruby 2.0.} spec.homepage = 'http://www.gfd-dennou.org/arch/ruby/products/gphys/' spec.licenses = ["BSD-2-Clause"]
3-2) ファイル構造について書く
require_paths でパスを指定。extensionファイルがある場合には、"ext"を先に書くようにする。
spec.files = `git ls-files -z`.split("\x0") spec.require_paths = ["ext","lib"] spec.test_files = spec.files.grep(%r{^(test|test_old|sample|testdata)/}) spec.bindir = "bin" spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) } spec.extensions << "ext/numru/gphys/extconf.rb"
3-3) インストールした後に出すメッセージ
もちろんなくても良い
spec.post_install_message = "Thanks for installing! You can add extra libraries (i.e., ruby-lapack, rb-grib) to enjoy powerful calculating and handling datasets."
3-4) 依存関係について(rubygems関係のみ)
add_development_dependency は開発環境で入るrubygemsパッケージ
spec.required_ruby_version = Gem::Requirement.new(">= 1.8") spec.add_dependency(%q<narray>, [">= 0.5.7"]) spec.add_dependency(%q<numru-misc>, [">= 0.1.0"]) spec.add_dependency(%q<numru-units>, [">= 1.7"]) spec.add_dependency(%q<narray_miss>, [">= 1.2.4"]) spec.add_dependency(%q<ruby-netcdf>, [">= 0.6.6"]) spec.add_dependency(%q<ruby-dcl>, [">= 1.6.1"]) spec.add_dependency(%q<ruby-fftw3>, [">= 0.3"]) #spec.add_dependency(%q<gsl>, [">= 1.14"]) spec.add_dependency(%q<rb-gsl>, [">= 1.14"]) #spec.add_dependency(%q<ruby-lapack>, [">= 1.5"]) #spec.add_dependency(%q<rb-grib>, [">= 0.2.0"]) spec.add_development_dependency(%q<bundler>,[">=1.3"]) spec.add_development_dependency(%q<rake>) spec.add_development_dependency(%q<rake-compiler>)