[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dennou-ruby:003642] Re: ruby gemについて



西澤です

2013年4月2日 17:13 Takeshi Horinouchi <horinout@xxxxxxxxxxxxxxxxx>:
> 堀之内です。
>
>> > 2年ほど?前 に、dennou-ruby プロダクトの顔をそろえましょうという提案をし、
>> > http://davis.gfd-dennou.org/rubygadgets/ja/?%28Others%29+Dennou+Ruby+%C0%BD%C9%CA%A5%C6%A5%F3%A5%D7%A5%EC%A1%BC%A5%C8
>> > に案を作りました。
>
> について質問です。(面倒かけてすみませんがよろしくお願いします。)
>
> | == ディレクトリ構成
> ...
> | == インストール
> ...
> |   rake nongeminstall とする (名前は要検討)
>
> は特に異論ありません。rake のタスク名も nongeminstall
> でまあいいかと。カッコよくはないですがわかりやすいし,
> 基本 (rake install) は gem というので良いと思います。
>
> | == Gem
> | * スペックを name.gemspec ファイルにわかるか、 Rakefile に書くか
> |   * 分けたほうがそれぞれ変更しやすいのでは?
>
> すみませんが,分けるかどうかといっても何をどうというのがないと
> わかってない私にはつらいです。解説か具体例がほしいなぁ。
Rakefile に書くというのは、
http://rake.rubyforge.org/classes/Rake/GemPackageTask.html
にあるように、
メソッドにgem に必要な情報を与えて gem ファイルを作成します。

gemspec ファイルを使う場合は、
同じ情報を別ファイルに記述しておいて、
gem コマンド or rake のタスクにより gem ファイルを作成します。


与えるのは同じ情報ですが、
記述するファイルを Rakefile にまとめるか、
別々にするかの違いです。


>
> | * rake build で作成
> |   * build という名前は bundler の仕様
>
> タスクの名前が bundler に合わせてあること自体は構わないです。
>
> | * lib/numru/a/b/ ディレクトリ以下に、version.rb を用意し、
> |   NumRu::A::B::VERSION 定数を定義するようにする
>
> これもいいと思います。
>
> | == Rakefile
> | * 拡張ライブラリのコンパイル、インストール、gem 作成、
> | source tar ball, test 実行のタスクを定義する
>
> すみません,その具体例がほしいです。
> 前のメールに私がかいたように,なにか良いチュートリアルページ
> ないですかね。
チュートリアルページは見かけないですね。

例は下のテンプレート案そのものです。

拡張ライブラリのコンパイルタスク
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

gem作成のタスク
bundler/gem_tasks を利用

source tar ball 作成タスク
bundler/gem_tasks を利用
Rake::PackageTask.new('name', "#{version}") do |t|
  t.need_tar_gz = true
  t.package_files.include `git ls-files`.split("\n")
end

テスト実行タスク
bundler/gem_tasks を利用



>
> | === テンプレート案
> |  # -*- mode: ruby; coding: utf-8 -*-
> |  require 'rake/packagetask'
> |  require 'rake/clean'
> |  begin
> |    require 'bundler/gem_tasks'
>
> これは bundler を使う例ですね。
>
> とりあえず bundler 等のツールを使わないで,
> 「Dennou Ruby 製品テンプレート」案に
> 準拠した例がほしいです。拡張ライブラリも含むのが良いです。
> rb-grib はまさに準拠してる?(迷ってた部分は結局どうしましたか)
> 他にはいい例ないでしょうか。
task の作成に bundler/gem_tasks を使っています。
確かにこれも本当は手で書いた方が気持ちが良いかもしれませんが、
gemspec は独立させているので、このくらいは良いかと思っています。

この例では、拡張ライブラリも含んでいます。



> # あとは外部の依存ライブラリ判断をしてるのがあれば
>    というところでしょうか。
これは試したことが無いです。
例外をうまく上げて、ユーザーに見えるようにすることは、
おそらく出来るのでは無いかと思っています。



西澤誠也

>
>
>> 西澤さま:
>>
>> ありがとうございます。おぼろげな記憶ではそういうのもあったような...
>> という状態です。当時はまともに検討せずすみませんでした。とりあえ
>> ず読んでみます。
>>
>> > gem で管理されていない物への依存関係ですが、
>> > 決まった方法はないと思います。
>> > dcl-c は ruby-dcl に同梱しても良いのではと思ったりもしています。
>> > netcdf は何か工夫が必要ですね。
>>
>> どんな工夫が考えられるありえるでしょうか。
>>
>> 堀之内
>>
>> > 西澤です
>> >
>> > 2年ほど?前 に、dennou-ruby プロダクトの顔をそろえましょうという提案をし、
>> > http://davis.gfd-dennou.org/rubygadgets/ja/?%28Others%29+Dennou+Ruby+%C0%BD%C9%CA%A5%C6%A5%F3%A5%D7%A5%EC%A1%BC%A5%C8
>> > に案を作りました。
>> >
>> > 結局議論は進まないまま、
>> > 案はそのまま案のままですので、
>> > 決定版ではありません。
>> > ここらへんでちゃんと決めた方が良いですね。
>> >
>> > gem の作り方ですが、
>> > 個人的な結論は、
>> > 極力ツールを使わず、手で gemspec を書く
>> > のが良いのではないかということです。
>> > ツールは流行廃りがありますし、
>> > 依存するものが増えるので、かえって後々の手間が増える気がします。
>> > gemspec はそんなに難しくなく、かつ、一度書けばあとはマイナー変更でよいので。
>> > また、すでにいくつか gem になっているものがあるので、
>> > それをコピペすればそんなに手間ではないはずです。
>> >
>> > gem で管理されていない物への依存関係ですが、
>> > 決まった方法はないと思います。
>> > dcl-c は ruby-dcl に同梱しても良いのではと思ったりもしています。
>> > netcdf は何か工夫が必要ですね。
>> > あと何があったでしょうか
>> >
>> >
>> >
>> > 西澤誠也
>> >
>> >
>> >
>> > 2013年4月2日 12:49 Takeshi Horinouchi <horinout@xxxxxxxxxxxxxxxxx>:
>> > > 堀之内です。
>> > >
>> > > 電脳Ruby関係のライブラリーのうち私がメンテするものは,
>> > > これまで(私自身は) gem で提供してませんでした。
>> > > 諸般の理由で gem は敬遠してたのですが,
>> > > gem が標準でなかった ruby 1.8 もぼちぼち終わりですので,
>> > > ここらで gem で提供するようにしないといかんかなと思い始めて
>> > > います(やっとかよという声も聞こえそうですが)。ぼちぼち
>> > > 調べようとしてるのですが,いろいろよくわからないので,
>> > > 教えていただけると助かります。
>> > >
>> > > Q1 gem の作り方のチュートリアルとしてお勧めのページを
>> > > 教えてください。ググればいろいろ出てきますが...。
>> > > ツール(bundlerとかjewelerとか)を使って一から作るというのを
>> > > 散見します。ゼロからはじめるならそういうのに乗っていくといいの
>> > > かなと思いますが,既存のライブラリーを gem 化するのに良い
>> > > ページもわかると嬉しいです。なお,ツールのはやりすたりに
>> > > あまり影響されたくないという意識もちょっとあります。
>> > >
>> > > Q2 拡張ライブラリを含む gem の作り方のチュートリアルで
>> > > お勧めのを教えてください。特に重要なのがラッパーで,
>> > > C で書かれた外部のライブラリーに依存するわけですが,
>> > > その依存関係の記述は最近はどうでしょう(以前はうまい
>> > > 仕組みがないと聞いた気がしますが)。同梱する extconf.rb
>> > > に書いてあっても,gem install するまで依存関係がみたされ
>> > > ないことがわからず,インストールが途中で止まるというのは
>> > > 嬉しくない(たぶんふつうそこで投げ出される)ので,
>> > > spec になんらか記述できるとよいと思いますが。
>> > > 不幸にしてそのような仕組みがない場合,どのように作ると
>> > > ユーザーをうまく導けるといった経験則などあると嬉しいです。



--
Seiya Nishizawa
RIKEN Advanced Institute for Computational Science
Tel: +81-78-940-5754, Fax: +81-78-304-4972
7-1-26, Minatojima-minami-machi, Chuo-ku, Kobe, Hyogo 650-0047, Japan