代码之家  ›  专栏  ›  技术社区  ›  Sniggerfardimungus

对于Ruby/Webrick,我需要Windows来识别shebang(!)记数法

  •  2
  • Sniggerfardimungus  · 技术社区  · 16 年前

    (请原谅我,我保证这会到达舍邦和窗户。)

    我有最简单的Webrick服务器:

    require 'webrick'
    include WEBrick
    
    s = HTTPServer.new(:Port=>2000, :DocumentRoot=>Dir::pwd)
    s.start
    

    再简单不过了。这个基本服务器接受HTTP连接(火狐、Internet Exploder、wget、telent),并适当地处理它们,只要我只是获取静态文档。但是,如果我将目录中的一个文件的扩展名设置为.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还没有被允许在窗户上着陆。你通常的公司妄想症让我无法修改Webrick,所以 我可以用操作系统(Windows)识别的c:/rubycgi/test.cgi来获取shebang符号吗?这样我就不必每次都明确地告诉它要使用哪个解释器了。 我可以将所有.cgi文件分配给Ruby,但从长远来看,这是有限制的。

    更新: 自从发布了这个消息之后,我突然想到从Ruby运行CGIWeb服务器可能根本不可能;Ruby没有分叉支持。由于无法分叉进程,CGI服务器必须一次执行每个CGI脚本,而忽略了第一个脚本完成时所有并发请求。虽然这可能对某些人来说是可以接受的,但对于我的应用程序来说是不可行的。不过,我仍然对我最初的问题“让舍邦在窗户下工作”的答案很感兴趣。

    4 回复  |  直到 14 年前
        1
  •  3
  •   Onorio Catenacci    16 年前

    我认为您需要的是将文件扩展名与Ruby相关联。我想不可能得到!#在Windows上工作的符号,但是可以让Windows使用特定的解释器自动启动脚本(如第二个示例中所示)。一步一步地讨论你想做的是 here. 您特别需要标题为“为未关联的文件类型创建文件关联”的部分。我认为这将完成你想做的。

        2
  •  2
  •   Diego Guillen    16 年前

    适用于Ruby1.8.6.pxxx和1.9.1.p0的通用解决方案 Windows如下:

    编辑文件:c:\ruby\lib\ruby\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”,其中包含 “Ruby exe”,以及 (如果在Windows上运行)它将传递附加参数 “c:\ruby\bin\ruby.exe”,到kernel.exe c()方法,以便 可以执行脚本。

        3
  •  0
  •   William Yeung    16 年前

    不是真的要争论…但是,当Mongrel速度更快并且使用Windows进行本地编译时,为什么还要麻烦Webrick呢?对于coz,这意味着不需要shebang。

        4
  •  0
  •   totochto    14 年前

    实际上,可以让Windows识别脚本文件中的shebang符号。它可以用一个相对较短的脚本来完成,比如ruby或autoit。脚本文件的第一行只需要一个相当简单的解析器,以及一些文件操作。当需要脚本文件的交叉兼容性,或者当Windows文件扩展名不够时,我已经这样做了几次。