Domanda

(Abbi pazienza, prometto che questo arriva a Shebang e Windows.)

Ho circa il più semplice dei server WEBRick messi insieme:

require 'webrick'
include WEBrick

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

Non potrebbe essere più semplice. Questo server di base accetta connessioni HTTP (Firefox, Internet Explorer, Wget, TELENT) e le gestisce in modo appropriato, purché stia solo recuperando documenti statici. Se, tuttavia, ho impostato uno dei file nella directory per avere un'estensione .cgi, ottengo un 500 indietro e quanto segue sul terminale del server:

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

Ho fatto alcune cose sulla riga di comando per imitare ciò che sta accadendo nella riga 45 di 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.

Chiaramente, WEBrick non è stato cancellato per l'atterraggio su Windows. I tuoi soliti mal di testa della paranoia aziendale mi impediscono di modificare webrick, quindi posso ottenere la notazione shebang in c: /rubyCGI/test.cgi riconosciuta dal sistema operativo (Windows), quindi non devo dirlo esplicitamente ogni volta quale interprete usare? Potrei assegnare tutti i file .cgi da associare a ruby, ma questo sarebbe limitante a lungo termine.

UPDATE: Da quando ho pubblicato questo, mi è venuto in mente che potrebbe non essere affatto possibile eseguire un web server cgi da ruby; ruby non ha supporto per il fork. Senza la possibilità di eseguire il fork di un processo, un server cgi dovrebbe eseguire ogni script cgi uno alla volta, trascurando tutte le richieste simultanee mentre il primo viene completato. Anche se questo potrebbe essere accettabile per alcuni, non funzionerebbe per la mia applicazione. Tuttavia, sarei ancora molto interessato a una risposta alla mia domanda originale & # 8212; quella di far funzionare shebang sotto Windows.

È stato utile?

Soluzione

Penso che quello che vuoi sia associare l'estensione del file a Ruby. Non penso che sia possibile far funzionare la notazione! # Su Windows, ma è possibile che Windows avvii automaticamente uno script con un interprete particolare (come nel tuo secondo esempio). Una buona discussione passo passo su ciò che vorresti fare è qui. la sezione intitolata: " Per creare associazioni di file per tipi di file non associati " ;. Penso che realizzerà ciò che stai cercando di fare.

Altri suggerimenti

Una soluzione generica che funziona sia con Ruby 1.8.6.pxxx che 1.9.1.p0 in poi Windows è il seguente:

Modifica il file: c: \ ruby ??\ lib \ ruby ??\ 1.9.1 \ webrick \ httpservlet \ cgi_runner.rb

Aggiungi le seguenti righe nella parte superiore del file:

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

Ora, individua l'ultima riga in cui è indicato: exec ENV [" SCRIPT_FILENAME "] Commenta quella riga e aggiungi il seguente codice:

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

Salva il file e riavvia il webrick server.

Spiegazione: Questo codice crea semplicemente una variabile "Ruby" con il percorso completo di " ruby.exe " ;, e (se sei in esecuzione su Windows) passa il parametro aggiuntivo & Quot; C: \ ruby ??\ bin \ ruby.exe " , al metodo Kernel.exec (), in modo che il tuo lo script può essere eseguito.

Non proprio per discutere ... ma perché preoccuparsi del webrick quando mongrel è molto più veloce e con nativo compilato con Windows? E di Coz, ciò significa che non è necessario shebang.

In realtà, è possibile convincere Windows a riconoscere la notazione shebang nei file di script. Può essere fatto in uno script relativamente breve, ad esempio Ruby o AutoIt. È richiesto solo un parser piuttosto semplice per la prima riga di un file di script, insieme ad alcune manipolazioni dei file. L'ho fatto un paio di volte quando era richiesta la compatibilità incrociata dei file di script o quando le estensioni di file di Windows non erano sufficienti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top