CGIとライブラリ検索パス
以下はDebianのRuby 1.6.7-3woody4の話.
id:flappphys:20050217#p1 で,DebianのREXMLが使いものにならないので自分で取ってきた話をした.しかしそれをCGIから使う方法ではまりにはまった.
ホーム下にインストールした野良REXMLをシステムワイドのREXMLより優先して読み込みたかったが,Rubyインタプリタの起動オプション -I
ではだめだった.コマンドラインから実行するときに -I/some/dir
を使うと /some/dir
は $LOAD_PATH
の先頭に来るのだが,CGIから使うためにshebangを使って #! /usr/bin/ruby -I/some/dir
とするとなぜか /some/dir
は $LOAD_PATH
の末尾に来て,require
ではREXML 1.2.5が読み込まれてしまう.
じゃあ環境変数 RUBYLIB
だ,というわけでshebangでenv(1)を使ったら*1,なぜかビジーループ.Rubyインタプリタはshebangのあるソースコードを引数で与えると,shebangのプログラムをexecするらしい.それで #! /bin/env RUBYLIB=/some/dir ruby -Ke
が無限にexecされてたようだ.Ruby言語プログラムとしては単なるコメント行だろうが!!! Windowsのcmd.exeを視野に入れたにしたって訳分からん仕様だ.オプションで入/切できないのか?
結局,シェルスクリプトを1段余計に噛ませてしまった.まぁ効率なんて気にしないからいいや.
しかしその後,最適解は $LOAD_PATH.unshift '/some/dir'
だと教えていただいた.うーむ $LOAD_PATH
に代入できないと分かった時点で直接変更を諦めたのだったが,破壊的メソッドは使えたのか...
追記:ノートPCのRuby 1.8.1-0vl20((なぜか ruby -v
の出力では "ruby 1.8.2 (2004-11-03) [i386-linux]
" とある.))では -I/some/dir
をコマンドラインで使うと /some/dir
が $LOAD_PATH
の先頭に,shebangで使うと先頭と末尾両方に追加される.
*1:env(1)ってこういうときに使うものだったのね.知らなかった.まぁ使えなかったわけだが.