Pergunta

(urso comigo, eu prometo isso fica para sheBANG e janelas.)

Eu tenho sobre o mais simples dos servidores WEBrick colocar juntos:

require 'webrick'
include WEBrick

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

Não poderia ser mais simples. Este servidor básico não aceita http conexões (firefox, internet exploder, wget, telent) e lida com eles de forma adequada, enquanto eu estou apenas buscar documentos estáticos. Se, no entanto, eu definir um dos arquivos no diretório para ter uma extensão .cgi, recebo uma volta 500 e o seguinte no servidor de terminal:

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

Já fiz algumas coisas na linha de comando para imitar o que está acontecendo na linha 45 da 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 não foi liberado para pouso em janelas. Suas dores de cabeça habituais de paranóia corporativos me impede de modificar webrick, então posso obter a notação shebang em c: /rubyCGI/test.cgi reconhecido pelo sistema operacional (Windows), então eu não tenho que lhe dizer explicitamente cada vez que intérprete de usar? eu poderia atribuir todos os arquivos .cgi a ser associados com rubi, mas isso seria limitar no longo prazo.

UPDATE: Desde postando isso, ocorreu-me que talvez não seja possível a todos a executar um servidor cgi web de rubi; rubi não tem suporte bifurcação. Sem capacidade de desembolsar um processo, um servidor cgi teria que executar cada script CGI um-em-um-tempo, negligenciando todas as solicitações simultâneas enquanto o primeiro concluída. Embora isso possa ser aceitável para alguns, não iria trabalhar para a minha candidatura. No entanto, eu ainda estaria muito interessado em uma resposta para o meu original de perguntas que de obter shebang trabalhando sob janelas.

Foi útil?

Solução

Eu acho que o que você quer é associar a extensão de arquivo com Ruby. Eu não acho que é possível obter a! # Notação para trabalhar em Windows, mas é possível obter o Windows para iniciar automaticamente um script com um intérprete particular (como no seu segundo exemplo). Um bom passo a discussão passo do que você quer fazer é aqui. Você quer especificamente a secção intitulada: "para criar associações de arquivo para tipos de arquivos não associados". Eu acho que vai realizar o que você está tentando fazer.

Outras dicas

Uma solução genérica que funciona tanto para o Ruby 1.8.6.pxxx e 1.9.1.p0 em Windows é o seguinte:

Edite o arquivo: c: \ ruby ??\ lib \ ruby ??\ 1.9.1 \ webrick \ HttpServlet \ cgi_runner.rb

Adicione as seguintes linhas no topo do arquivo:

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

Agora, localize a última linha onde está diz: ENV exec [ "SCRIPT_FILENAME"] Comentário que a linha para fora e adicione o seguinte 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 ---

Salve o arquivo e reinicie o servidor webrick.

Explicação: Este código apenas constrói uma variável 'Ruby' com o caminho completo para "Ruby.exe", e (Se você estiver executando no Windows) passa o parâmetro adicional "C: \ ruby ??\ bin \ ruby.exe", ao método Kernel.exec (), de modo que o seu script pode ser executado.

Não é realmente a discutir ... mas por que se preocupar webrick quando vira-lata é muito mais rápido e com nativo compilado com janelas? E, coz, isso significa que não é necessário nenhum shebang.

Na verdade, é possível obter o Windows para reconhecer notação shebang em arquivos de script. Isso pode ser feito em um período relativamente curto de script em dizer, Ruby ou AutoIt. Apenas um analisador bastante simples para a primeira linha de um arquivo script é necessário, juntamente com alguma manipulação de arquivos. Eu tenho feito isso algumas vezes quando um cross-compatibilidade de arquivos de script foi exigido ou quando extensões de arquivo do Windows não era suficiente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top