setup.rb / install.rb / extconf.rb 対応自動インストーラ setuprb を作ってみた
RubyGemsを使わないRubyスクリプトのinstallはsetup.rbが定番だ。だからsetup.rbを入れておくのが礼儀となっている。
現在のバージョン(といっても何年も前だが)は「ruby setup.rb」を実行するだけでいいのだが、パッケージ附属のsetup.rbは古いこともある。その場合、いちいち
ruby setup.rb config ruby setup.rb setup sudo ruby setup.rb install
と実行することとなる。ましてやRuby 1.8、Ruby 1.9を共存させている人はrubyをruby19と置き換えて再実行する必要がある。面倒この上ない。*1
さらに悪いことに、setup.rbの代わりにinstall.rbを入れていることもある。install.rbも使い方は同じ。だったらsetup.rb / install.rbを自動検出して、↑のコマンドをstep by stepで実行するスクリプトを作ろう。
おまけでextconf.rbが含まれている場合も自動検出してインストールできるようにした。
Rubyインタプリタのファイル名はruby18、ruby19であるとする。適宜書き換えるように。
#!/usr/local/bin/ruby # setup.rb/install.rb wrappeger installer = (Dir["setup.rb\0install.rb\0extconf.rb"]).first raise "no installer" unless installer def prompt print "==== press Enter"; gets end def sh(cmd) system cmd prompt end def install(ruby, installer) puts "Ruby:#{ruby} Installer:#{installer}"; prompt if installer == 'extconf.rb' extconf ruby else aamine ruby, installer end end def extconf(ruby) system "make clean" if File.exist? "Makefile" sh "#{ruby} extconf.rb && make" sh "sudo make install" end def aamine(ruby, installer) sh "#{ruby} #{installer} config" sh "#{ruby} #{installer} setup" sh "sudo #{ruby} #{installer} install" end install "ruby18", installer install "ruby19", installer
追記
setup.rb自身はだいぶ前から安定しているものの、古くからやっているプロジェクトの場合はsetup.rbが古い場合もありますね。
RubyGemsは便利だが、RubyGems自身のオーバーヘッドが問題になることがあります。CGIスクリプトとか、瞬時に終了するスクリプトを作成するのには向いていません。fastRIやErubisはsetup.rb経由で入れています。
*1:今のバージョンのsetup.rbでも古いやり方は使える。