Pregunta

(Tengan paciencia, les prometo que esto se convertirá en shebang y windows.)

Tengo uno de los servidores WEBRick más sencillos juntos:

require 'webrick'
include WEBrick

s = HTTPServer.new(:Port=>2000, :DocumentRoot=>Dir::pwd)
s.start

No podría ser más simple. Este servidor básico acepta conexiones http (firefox, internet exploder, wget, TELENT) y las trata de manera adecuada, siempre y cuando solo esté recuperando documentos estáticos. Sin embargo, si configuro uno de los archivos en el directorio para que tenga una extensión .cgi, obtengo 500 de vuelta y lo siguiente en la terminal del servidor:

ERROR CGIHandler: c:/rubyCGI/test.cgi: 
C:/...[snip]...webrick/httpservlet/cgi_runner.rb:45: in 'exec': Exec format error - ...[snip]...

He hecho algunas cosas en la línea de comandos para imitar lo que está pasando en la línea 45 de cgi_runner.rb

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.

Claramente, WEBrick no ha sido autorizado para aterrizar en ventanas. Sus habituales dolores de cabeza de la paranoia corporativa me impiden modificar webrick, por lo que puedo obtener la notación shebang en c: /rubyCGI/test.cgi reconocido por el sistema operativo (windows) para no tener que indicarlo explícitamente cada vez ¿Qué intérprete usar? Podría asignar todos los archivos .cgi para que estén asociados con ruby, pero eso sería limitativo a largo plazo.

ACTUALIZACIÓN: Desde que publiqué esto, se me ha ocurrido que tal vez no sea posible ejecutar un servidor web cgi desde ruby; Rubí no tiene soporte de bifurcación. Sin la capacidad de bifurcar un proceso, un servidor cgi tendría que ejecutar cada script cgi uno a la vez, descuidando todas las solicitudes concurrentes mientras se completaba la primera. Si bien esto puede ser aceptable para algunos, no funcionaría para mi aplicación. Sin embargo, todavía estaría muy interesado en una respuesta a mi pregunta original: # 8212; la de que Shebang trabaje bajo Windows.

¿Fue útil?

Solución

Creo que lo que quieres es asociar la extensión de archivo con Ruby. No creo que sea posible que la notación! # Funcione en Windows, pero sí es posible que Windows inicie automáticamente un script con un intérprete en particular (como en el segundo ejemplo). Una buena discusión paso a paso de lo que querría hacer es aquí. Usted desea específicamente la sección titulada: " Para crear asociaciones de archivos para tipos de archivo no asociados " ;. Creo que eso logrará lo que estás tratando de hacer.

Otros consejos

Una solución genérica que funciona tanto para Ruby 1.8.6.pxxx como para 1.9.1.p0 en Windows es el siguiente:

Edite el archivo: c: \ ruby ??\ lib \ ruby ??\ 1.9.1 \ webrick \ httpservlet \ cgi_runner.rb

Agregue las siguientes líneas en la parte superior del archivo:

if "1.9.1" == RUBY_VERSION
  require 'rbconfig'  #constants telling where Ruby runs from
end

Ahora, localice la última línea donde dice: exec ENV [" SCRIPT_FILENAME "] Comente esa línea y agregue el siguiente código:

# --- 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 ---

Guarde el archivo y reinicie el servidor webrick.

Explicación: Este código simplemente crea una variable 'Ruby' con la ruta completa a " ruby.exe " ;, y (Si está ejecutando en Windows) pasa el parámetro adicional " c: \ ruby ??\ bin \ ruby.exe " , al método Kernel.exec (), para que su El script puede ser ejecutado.

No es realmente para discutir ... pero, ¿por qué molestar a webrick cuando mongrel es mucho más rápido y compilado de forma nativa con ventanas? Y de Coz, eso significa que no se necesita shebang.

En realidad, es posible hacer que Windows reconozca la notación shebang en los archivos de script. Se puede hacer en un script relativamente corto, por ejemplo, Ruby o AutoIt. Solo se requiere un analizador bastante simple para la primera línea de un archivo de script, junto con algo de manipulación de archivos. Lo he hecho un par de veces cuando se requería compatibilidad cruzada de archivos de script o cuando las extensiones de archivo de Windows no eran suficientes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top