2008-10-27 8 views
2

(ours avec moi, je vous promets cela devient case et les fenêtres.)Ruby/webrick, j'ai besoin de Windows pour reconnaître tralala notation

J'ai au sujet le plus simple des serveurs Webrick mis ensemble (#!):

require 'webrick' 
include WEBrick 

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

Ne pourrait pas être plus simple. Ce serveur de base accepte les connexions http (firefox, Internet Exploder, wget, TELENT) et les traite de manière appropriée, tant que je ne fais que récupérer des documents statiques. Si, cependant, je mis un des fichiers dans le répertoire pour une extension .cgi, je reçois un 500 dos et le suivant sur le terminal du serveur:

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

Je l'ai fait quelques petites choses sur la commande ligne pour mimer ce qui se passe dans la ligne 45 du 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. 

de toute évidence, WEBrick n'a pas été autorisé à atterrir sur les fenêtres. Vos maux de tête habituels de la paranoïa corporative m'empêchent de modifier webrick, donc puis-je obtenir la notation shebang dans c: /rubyCGI/test.cgi reconnu par le système d'exploitation (windows) de sorte que je n'ai pas à lui dire explicitement à chaque fois quel interprète utiliser? Je pourrais assigner tous les fichiers .cgi à être associés à ruby, mais cela serait limitant à long terme.

MISE À JOUR: Depuis la publication de cet article, il m'est apparu qu'il ne serait peut-être pas possible d'exécuter un serveur Web cgi à partir de ruby; ruby n'a pas de support de fourche. En l'absence de possibilité de bifurquer un processus, un serveur cgi devrait exécuter chaque script cgi un à la fois, en négligeant toutes les demandes simultanées pendant que le premier achevait. Bien que cela puisse être acceptable pour certains, cela ne fonctionnerait pas pour ma demande. Néanmoins, je serais toujours très intéressé par une réponse à ma question initiale - celle de faire travailler shebang sous Windows.

Répondre

3

Je pense que ce que vous voulez est d'associer l'extension de fichier avec Ruby. Je ne pense pas qu'il soit possible de faire fonctionner la notation! # Sous Windows mais il est possible que Windows lance automatiquement un script avec un interpréteur particulier (comme dans votre second exemple). Une bonne discussion étape par étape de ce que vous voulez faire est here. Vous voulez spécifiquement la section intitulée: "Pour créer des associations de fichiers pour les types de fichiers non-associés". Je pense que cela va accomplir ce que vous essayez de faire.

1

Pas vraiment à discuter ... mais pourquoi s'embêter quand webrick est beaucoup plus rapide et avec natif compilé avec Windows? Et de coz, cela signifie qu'aucun shebang n'est nécessaire.

2

Une solution générique qui fonctionne à la fois Ruby 1.8.6.pxxx et 1.9.1.p0 sur de Windows est la suivante:

Modifier le fichier: c: \ Ruby \ lib \ Ruby \ 1.9.1 \ webrick \ HttpServlet \ cgi_runner.rb

Ajoutez les lignes suivantes en haut du fichier:

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

maintenant, recherchez la dernière ligne où il est écrit: exec ENV [ "SCRIPT_FILENAME"] Commentaire que aligner et ajouter le code suivant:

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

Enregistrez le fichier et redémarrez le serveur webrick. Explication: Ce code ne fait que générer une variable 'Ruby' avec le chemin complet de "ruby.exe ", et (si vous utilisez Windows) il passe le paramètre supplémentaire " c: \ ruby ​​\ bin \ ruby.exe ", à la méthode Kernel.exec(), afin que votre script puisse être exécuté

+0

fonctionne pour moi, thnx – peter

0

En fait, il est possible d'obtenir Windows pour reconnaître la notation shebang dans les fichiers de script.Il peut être fait dans un script relativement court dans say, Ruby ou AutoIt.Un simple analyseur simple pour la première ligne d'un fichier de script est nécessaire, ainsi que certaines manipulations de fichiers.J'ai fait cela à quelques reprises quand une compatibilité croisée des fichiers de script était nécessaire ou lorsque les extensions de fichiers Windows ne suffisaient pas

Questions connexes