2008-10-27 3 views
2

(베어 나와 함께, 나는이 오두막과 창을 얻는 것을 약속드립니다.)루비 /에 WEBrick, 나는 오두막 인식 창을 필요로 표기에게

나는에 WEBrick 서버의 간단한에 대해이

함께 넣어 (#를!) :

require 'webrick' 
include WEBrick 

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

더 간단 할 수 없습니다. 이 기본 서버는 HTTP 연결 (firefox, internet exploder, wget, TELENT)을 받아들이고 정적 문서를 가져 오는 한 적절히 처리합니다.

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

내가 명령에 몇 가지 일을했습니다 경우, 그러나, 나는가 .cgi 확장자를 가지고있는 디렉토리에있는 파일 중 하나를 설정, I는 서버의 터미널에 500 다시 다음을 얻을 선이 분명

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. 

cgi_runner.rb

의 라인 (45)에 무슨 일이 일어나고 있는지 모방하기에 WEBrick 창문에 착륙 허가되지 않았습니다. 기업 편집증에 대한 일반적인 두통으로 인해 webrick을 수정할 수 없으므로 C에서 shebang 표기법을 얻을 수 있습니까 : /rubyCGI/test.cgi OS (Windows)에서 인식하므로 명시 적으로 통역사에게 알릴 필요가 없습니다 사용? 모든 .cgi 파일을 루비와 연결되도록 할당 할 수는 있지만 장기적으로는 제한적입니다.

업데이트 : 글을 올린 이래로 루비에서 CGI 웹 서버를 돌릴 수 없을 수도 있습니다. 루비는 포크를 지원하지 않습니다. 프로세스를 포크 할 수있는 능력이 없으면 cgi 서버는 각 cgi 스크립트를 한 번에 하나씩 실행해야합니다. 첫 번째 스크립트가 완료되는 동안 모든 동시 요청은 무시됩니다. 이것이 일부에서는 받아 들일지 모르지만 내 응용 프로그램에서는 작동하지 않습니다. 그럼에도 불구하고, 나는 원래의 질문에 대한 답변에 여전히 관심이있을 것입니다.

답변

3

나는 당신이 원하는 것은 Ruby와 파일 확장자를 연관시키는 것이라고 생각한다. Windows에서! # 표기법을 사용할 수는 없지만 Windows가 특정 인터프리터를 사용하여 스크립트를 자동 실행하도록 할 수 있습니다 (두 번째 예와 같이). 당신이하고 싶은 일에 대한 단계별 토론이 좋은 단계입니다. here. 구체적으로 "관련없는 파일 형식에 대한 파일 연결 만들기"섹션을 원합니다. 나는 당신이하려고하는 것을 성취 할 것이라고 생각합니다.

1

정말 논쟁의 여지가 없지만 ... 왜 잡종이 훨씬 더 빠르며 원산지가 창문으로 컴파일 될 때 왜 webrick을 괴롭히지 않습니까? 그리고 coz의 그것은 shebang가 필요 없다는 것을 의미합니다.

파일을 편집 : C : \ 루비 \ lib 디렉토리 \ 루비 \ 1.9.1

2

Windows에서 모두 루비 1.8.6.pxxx 및 1.9.1.p0을 위해 작동하는 일반적인 솔루션은 다음이다

파일의 맨 위에 다음 줄을 추가 cgi_runner.rb \에 WEBrick \ HttpServlet을 \ : 이제

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

이며, 마지막 줄을 찾습니다은 말한다 : 간부 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

나를 위해 작동합니다, thnx – peter

0

사실, 스크립트 파일에서 shebang 표기법을 인식하도록 할 수 있습니다.이 스크립트는 Ruby 나 AutoIt과 같은 비교적 짧은 스크립트에서 수행 할 수 있습니다. 스크립트 파일의 첫 번째 줄 일부 파일 조작과 함께 필요합니다. 스크립트 파일의 상호 호환이 필요하거나 Windows 파일 확장명으로 충분하지 않은 경우이 작업을 몇 번했습니다.

관련 문제