From: Minero Aoki Date: 2001-12-25T02:53:40+09:00 Subject: [ruby-dev:15545] Re: fileutils (2) あおきです。 In mail "[ruby-dev:15540] Re: fileutils (2)" TAKAHASHI Masayoshi wrote: > 高橋征義です。 > もう一つ、「ftoolsの代替」という印象もあります。以前、あおき > さんは「ftoolsはFileクラスにメソッドを追加してしまうのが > ちょっと」みたいなことを言っていたので、ftoolsを新しくしたい > のかなあ、と。 それはあるかも。でも別に積極的になくしたいわけではないです。 ぼくとしてはようするに fileutils みたいなのを自分が使えれば それで満足です。 > 実際のところ、ftoolsを使っているのは各種install.rbが多いです > よね。なので、そういうツールのためかなあ、と、こんな感じです。 うーむ。やっぱりそういうことですか。 > えーと、「普通makeとかがカバーしている範囲」で、Rubyに > 関係ありそうなところというと、外部コマンドを利用して > コンパイルしたりドキュメントを作ったり、さらにはFTPしたり > webサイトを更新したり、というところですか? > ちょっとイメージがつかめないのですが……。 そんなとこです。ぼくが使ってる用途としてはこんな感じ。 * ライブラリのパッケージを作る (mkdir → cp cp cp → tar c → rm_rf) * サイトの HTML を更新する (update_file) * ちょっと make っぽい依存関係の処理をはさむ (newest?) * cvs.ruby-lang.org に入れるソースを自動生成する (ChangeLog を更新するときに mv でバックアップ取ったり戻したりとか) * 昔は chdir にブロックがなかったのでそれを吸収するためもあった 昔はサイトの更新に ftpup を使ってたので無駄な更新をしないのが 重要でしたから、update_file とか newest? を結構つかいました。 今は rsync なので派手に全部生成しなおしてますけど。 > makeの代替とか、それこそシェルの代替がほしいわけでは > ないんですよね? それだったらほとんどmakeやシェルで十分 > かな、と思いますし。唯一問題になるのは移植性ですが、 > ふだん使うちょっとしたものなら移植性はあまり問題に > なりませんし。 「ぼくの最初の個人的な作成動機は」、make の代替です。最初は make 使ってたんですけど、メタデータをあっちこっちにやりとりするのが 面倒でしかたなかったんで、Ruby で書いたツールに移行したんです。 ただそうしたら今度は cp とかが面倒になってしまったのでそれを埋め るために今度は fileutils を作った。 というのが歴史的経緯です。 > > また、fileutils があっても > > 別にインストーラを書くのは全然楽にならないとも思います。 > > ftoolsの代わりにfileutilsを使えば、たとえばmake -n install相当の > 「どこにインストールされるかを表示するけど、実際にはインストール > しない」ということが簡単に書けますよね。 しかしそれでは、 * 可搬性が下がる (1.8 移行でしかインストールできない) * もし fileutils がバグ入りだった場合に困る という問題があります。コピーして使えばこの問題はないですが、 そこまでがんばって使う機能とは思えないです。特に noop なんて ftools を使っても require 'ftools' noop = Object.new %w( cp mv rm_f makedirs install chown ).each do |name| noop.instance_eval "def #{name}(*args) end" end op = $noop ? noop : File と、6 行で実装できます。 そもそも、インストーラが欲しいなら最初から汎用インストーラその ものを添付してしまえばいいんじゃないでしょうか? そうすれば make -n 相当の機能が、実装するまでもなく、手に入ります。 簡単なものでもインストーラを書くのは結構難しいものです。 Config::CONFIG の値とか、UNIX の慣習とか、Ruby のバージョンに よる RUBYLIB のパスの違いとか、対応すべき点が多々あります。 それに各自それぞれに対応するのは時間の浪費にしかなりません。 > という感じで、install.rb的な物以外の用途があんまり思いつか > ない、というところなのです。 Ruby のある生活に役立つ。とか。(make が薄れていく生活、でも可) make ってディレクトリを越えたメタデータのやりとりが面倒だし、 制御構造使いにくいし、だんだんダミーターゲットばっかりになって くるし……。Ruby ベースにするとそういう点はすごく楽になると思い ます (ちょうど ruby-talk でも make replacement の話が出てますね)。 あとさっき気がついたんですけど、lib/shell/ をよく見ると cd や pwd があったりして結構似たようなことをしてるんですね。でも cp や mv は ftools に投げてるので、そのへんをカバーできるように 考えるのもいいかもしれません。 ------------------------------------------------------------------- 青木峰郎