Ruby/Webrick の場合、Windows でシバン (#!) 表記を認識できるようにする必要があります
質問
(我慢してください、これはシバンと窓につながることを約束します。)
最も単純な WEBRick サーバーをまとめました。
require 'webrick'
include WEBrick
s = HTTPServer.new(:Port=>2000, :DocumentRoot=>Dir::pwd)
s.start
これ以上にシンプルなことはありません。この基本的なサーバーは、静的なドキュメントを取得するだけである限り、http 接続 (Firefox、Internet Exploder、wget、TELENT) を受け入れ、それらを適切に処理します。ただし、ディレクトリ内のファイルの 1 つに .cgi 拡張子を付けるように設定すると、500 が返され、サーバーの端末には次の内容が表示されます。
ERROR CGIHandler: c:/rubyCGI/test.cgi:
C:/...[snip]...webrick/httpservlet/cgi_runner.rb:45: in 'exec': Exec format error - ...[snip]...
cgi_runner.rb の 45 行目で起こっていることを模倣するために、コマンド ラインでいくつかのことを実行しました。
c:\>ruby
exec "c:/rubyCGI/test.cgi"
^Z
(same error erupts)
c:\>ruby
exec "ruby c:/rubyCGI/test.cgi"
^Z
Content-type: text/html
Mares eat oats and does eat oats and I'll be home for Christmas.
明らかに、WEBrick は Windows にインストールすることが許可されていません。いつもの企業偏執症のせいで、Webrick を修正できないので、 c:/rubyCGI/test.cgi のシバン記法を OS (Windows) に認識させて、どのインタープリターを使用するかを毎回明示的に指示する必要がないようにすることはできますか? すべての .cgi ファイルを Ruby に関連付けることもできますが、長期的には限界があります。
アップデート:これを投稿して以来、Ruby から CGI Web サーバーを実行することはまったく不可能ではないかと思いつきました。Ruby にはフォークのサポートがありません。プロセスをフォークする機能がないため、CGI サーバーは各 CGI スクリプトを一度に 1 つずつ実行し、最初のリクエストが完了するまでのすべての同時リクエストを無視する必要があります。これは一部の人にとっては許容できるかもしれませんが、私のアプリケーションでは機能しません。それにもかかわらず、私は依然として、私の最初の質問、つまり窓の下でシバンを動作させるという質問に対する答えに非常に興味を持っています。
解決
あなたが望むのは、ファイル拡張子をRubyに関連付けることだと思います。 !#表記をWindowsで動作させることはできないと思いますが、Windowsに特定のインタープリターを使用してスクリプトを自動的に起動させることは可能です(2番目の例のように)。あなたがしたいことのステップバイステップの議論は、こちらです。見出しのセクション:「関連付けられていないファイルタイプのファイルの関連付けを作成するには」。私はそれがあなたがやろうとしていることを達成すると思う。
他のヒント
WindowsのRuby 1.8.6.pxxxと1.9.1.p0の両方で機能する一般的なソリューションは次のとおりです。
ファイルを編集します。c: uby\lib uby\1.9.1\webrick\httpservlet\cgi_runner.rb
ファイルの先頭に次の行を追加します。
if "1.9.1" == RUBY_VERSION require 'rbconfig' #constants telling where Ruby runs from end
次に、次のように書かれている最後の行を見つけます。exec ENV["SCRIPT_FILENAME"] その行をコメントアウトし、次のコードを追加します。
# --- from here --- if "1.9.1" == RUBY_VERSION #use RbConfig Ruby = File::join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name']) Ruby << RbConfig::CONFIG['EXEEXT'] else # use ::Config Ruby = File::join(::Config::CONFIG['bindir'], ::Config::CONFIG['ruby_install_name']) Ruby << ::Config::CONFIG['EXEEXT'] end if /mswin|bccwin|mingw/ =~ RUBY_PLATFORM exec "#{Ruby}", ENV["SCRIPT_FILENAME"] else exec ENV["SCRIPT_FILENAME"] end # --- to here ---
ファイルを保存し、Webrick サーバーを再起動します。
説明:このコードは、変数 'Ruby' をフルパスでビルドするだけです。 "ルビー.exe"、および (Windowsで実行している場合)追加のパラメータを渡します "c: uby\bin uby.exe" を Kernel.exec() メソッドに追加して、 スクリプトを実行できます。
実際に議論するわけではありません...しかし、mongrelがはるかに高速で、Windowsでコンパイルされたネイティブでwebrickを悩ませるのはなぜですか?そして、cozの意味は、シバンが不要であることを意味します。
実際には、Windowsにスクリプトファイルのシバン表記を認識させることができます。 RubyやAutoItなどの比較的短いスクリプトで実行できます。スクリプトファイルの最初の行には、いくつかのファイル操作とともに、かなり単純なパーサーのみが必要です。スクリプトファイルの相互互換性が必要な場合、またはWindowsファイル拡張子では不十分な場合に、これを数回行いました。