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

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



堀之内です。

> > これは bundler を使う例ですね。
...
> gemspec は独立させているので、このくらいは良いかと思っています。

要するに,これが提案する例だということですね。
(bundler のライブラリは使ってるけど,bundle コマンド
で生成するといったことはしてないということで,
これが「手で書く」例であると。)

さて,やはり文章だけでは全体像を把握するのがなかなか難しい
ので,実際に動くサンプル一式がほしいです。中身はしょうも
なくていいですが,「ディレクトリ構成」に従ってて
rake のタスクが全部あるものということです。それを
まねることで学びたいと思います。

お願いできるでしょうか。

> 西澤です
> 
> 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

堀之内 武
北海道大学 地球環境科学研究院 地球圏科学部門
〒060-0810 札幌市北区北10条西5丁目