문제

(나와 함께, 나는 이것이 shebang과 창문에 도달할 것을 약속합니다.)

가장 간단한 WEBRick 서버를 구성했습니다.

require 'webrick'
include WEBrick

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

이보다 더 간단할 수는 없습니다.이 기본 서버는 http 연결(firefox, Internet Explorer, wget, TELENT)을 허용하고 정적 문서를 가져오는 한 이를 적절하게 처리합니다.그러나 디렉토리에 있는 파일 중 하나의 확장자를 .cgi로 설정하면 500이 반환되고 서버 터미널에는 다음이 표시됩니다.

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

나는 cgi_runner.rb의 라인 45에서 일어나는 일을 흉내내기 위해 명령줄에서 몇 가지 작업을 수행했습니다.

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은 창문에 착륙할 수 있도록 허가되지 않았습니다.당신의 일반적인 기업 편집증으로 인한 두통 때문에 웹릭을 수정할 수 없습니다. c:/rubyCGI/test.cgi의 shebang 표기법을 OS(windows)에서 인식하여 어떤 인터프리터를 사용할지 매번 명시적으로 알릴 필요가 없도록 할 수 있나요? Ruby와 연관되도록 모든 .cgi 파일을 할당할 수 있지만 장기적으로는 제한이 될 것입니다.

업데이트:이 글을 게시한 후, Ruby에서 CGI 웹 서버를 실행하는 것이 전혀 불가능할 수도 있다는 생각이 들었습니다.루비는 포크를 지원하지 않습니다.프로세스를 분기할 수 있는 기능이 없으면 cgi 서버는 각 cgi 스크립트를 한 번에 하나씩 실행해야 하며 첫 번째 스크립트가 완료되는 동안 모든 동시 요청을 무시해야 합니다.일부에게는 이것이 허용될 수 있지만 내 응용 프로그램에는 작동하지 않습니다.그럼에도 불구하고 나는 원래 질문에 대한 답변, 즉 창문 아래에서 shebang을 작동시키는 것에 대한 답변에 여전히 매우 관심이 있습니다.

도움이 되었습니까?

해결책

당신이 원하는 것은 파일 확장자를 Ruby와 연결하는 것입니다. Windows에서 작동하기 위해!# 표기법을 얻을 수는 없다고 생각하지만 Windows가 특정 통역사와 같이 스크립트를 자동으로 시작할 수 있습니다 (두 번째 예제에서와 같이). 당신이하고 싶은 일에 대한 좋은 단계별 토론은 여기. 구체적으로 섹션은 "관련되지 않은 파일 유형에 대한 파일 연결을 만듭니다"라는 섹션을 원합니다. 나는 그것이 당신이하려는 일을 성취 할 것이라고 생각합니다.

다른 팁

Windows에서 Ruby 1.8.6.pxxx 및 1.9.1.p0 모두에 적합한 일반적인 솔루션은 다음과 같습니다.

파일을 편집합니다:c: uby\lib uby\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.exe"로가는 전체 경로가있는 변수 'Ruby'를 작성하고 (Windows에서 실행중인 경우) 추가 매개 변수 "C : Ruby bin Ruby.exe"를 전달합니다. 스크립트를 실행할 수 있도록 kernel.exec () 메소드.

실제로 논쟁의 여지가 없지만 왜 Mongrel이 훨씬 빠르고 창문으로 고유 할 때 Webrick을 귀찮게합니까? 그리고 Coz의 경우, 그것은 Shebang이 필요하지 않다는 것을 의미합니다.

실제로 Windows가 스크립트 파일에서 Shebang 표기법을 인식하도록 할 수 있습니다. Ruby 또는 Autoit에서 비교적 짧은 스크립트로 수행 할 수 있습니다. 일부 파일 조작과 함께 스크립트 파일의 첫 번째 줄에 대한 간단한 파서 만 필요합니다. 스크립트 파일의 교차 적합성이 필요했거나 Windows 파일 확장이 충분하지 않은 경우 몇 번 이나이 작업을 수행했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top