Для ruby ​​/ webrick мне нужны окна, чтобы распознать обозначение shebang (#!) - PullRequest
2 голосов
/ 27 октября 2008

(Потерпи меня, я обещаю, что доберется до Шебанга и окон.)

У меня есть простейший из серверов WEBRick:

require 'webrick'
include WEBrick

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

Не может быть проще. Этот базовый сервер принимает http-соединения (firefox, 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]...

Я сделал несколько вещей в командной строке, чтобы имитировать то, что происходит в строке 45 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.

Очевидно, что WEBrick не был очищен для посадки на окна. Ваши обычные головные боли корпоративной паранойи мешают мне изменить webrick, поэтому могу ли я получить обозначение шебанга в c: /rubyCGI/test.cgi, распознаваемое ОС (windows), поэтому мне не нужно явно говорить это каждый раз какой интерпретатор использовать? Я мог бы назначить все файлы .cgi, которые будут связаны с ruby, но это будет ограничивать в долгосрочной перспективе.

UPDATE: После публикации этого сообщения мне пришло в голову, что, возможно, вообще невозможно будет запустить веб-сервер cgi из ruby; Рубин не имеет поддержки разветвления. Без возможности ветвления процесса сервер cgi должен был бы выполнять каждый скрипт cgi по одному, игнорируя все одновременные запросы, пока первый завершен. Хотя это может быть приемлемо для некоторых, это не будет работать для моего приложения. Тем не менее, я все еще был бы очень заинтересован в ответе на мой первоначальный вопрос - о том, как заставить Шебанга работать под окнами.

Ответы [ 4 ]

3 голосов
/ 28 октября 2008

Я думаю, что вы хотите связать расширение файла с Ruby. Я не думаю, что можно заставить нотацию! # Работать в Windows, но можно заставить Windows автоматически запускать скрипт с определенным интерпретатором (как в вашем втором примере). Хорошее пошаговое обсуждение того, что вы хотели бы сделать, это здесь. Вам особенно нужен раздел, озаглавленный: «Создание ассоциаций файлов для несвязанных типов файлов». Я думаю, что это достигнет того, что вы пытаетесь сделать.

2 голосов
/ 28 мая 2009

Общее решение, которое работает на Ruby 1.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.exec (), чтобы ваш скрипт может быть выполнен.

0 голосов
/ 08 сентября 2010

На самом деле, можно заставить Windows распознавать обозначения Шебанга в файлах сценариев. Это может быть сделано относительно коротким скриптом, скажем, Ruby или AutoIt. Требуется только довольно простой парсер для первой строки файла скрипта, а также некоторые манипуляции с файлом. Я делал это пару раз, когда требовалась перекрестная совместимость файлов сценариев или когда не хватало расширений Windows.

0 голосов
/ 28 октября 2008

Не особо спорить ... но зачем беспокоиться о вебрике, когда монгрел намного быстрее и с нативной компиляцией с windows? И потому, что это означает, что шебанг не нужен.

...