2012-11-28 2 views
4

은 다음과 레일 설치 가정이 예상대로 작동하지 않습니다 다단 확장자를 사용카피 스트라 노 : require_relative는

  • 레일 3.2.9
  • 카피 스트라 노 2.13.5
  • (즉 카피 스트라 노/내선/다단계)
  • 생산 단계가 정의되었습니다. Rails.root/config/deploy/production.rb. production.rb 내부

, 당신 하지 사용 require_relative, 그것은 — 보인다 수 있습니다 당신은 'basepath 추론 할 수 없습니다'를 오류가 결국. 그러나 단지 ruby production.rb이라면 require_relative가 정상적으로 작동합니다.

왜 이런 경우입니까? Capistrano가 require_relative가 예상대로 작동하지 않도록 코드를로드/실행하는 것 같습니다.

이 코드는 Passenger Rack app 'cannot infer basepath'과 비슷하다고 생각합니다. 대략적으로 말해서 코드가 궁극적으로로드/실행되는 방식에 따라 require_relative가 실패 할 수 있습니다.

분기 ruby_1_9_3의 require_relative 소스가 아래에 나와 있으며 require_relative가 호출 스택에 의존하는 방식을 보여줍니다. 그러나 종단 간 그림은 Capstrano가 코드를 찾아서 실행하는 방법과 호출 스택에 미치는 영향에 대해 — 완전하지 않습니다.

여기서는 아무 것도 해결할 수 없다고 생각하지만,이 문제를 스스로 해결할 시간 대신에, 어떤 일이 벌어지고 있는지에 대한 전문가의 통찰력은 특정 문제뿐만 아니라 통찰력을 통해 크게 감사하게 될 것입니다. 모자와 루비가 어떻게 작동하는지.

// load.c 
VALUE 
rb_f_require_relative(VALUE obj, VALUE fname) 
{ 
    VALUE base = rb_current_realfilepath(); 
    if (NIL_P(base)) { 
     rb_raise(rb_eLoadError, "cannot infer basepath"); 
    } 
    base = rb_file_dirname(base); 
    return rb_require_safe(rb_file_absolute_path(fname, base), rb_safe_level()); 
} 

// vm_eval.c 
VALUE 
rb_current_realfilepath(void) 
{ 
    rb_thread_t *th = GET_THREAD(); 
    rb_control_frame_t *cfp = th->cfp; 
    cfp = vm_get_ruby_level_caller_cfp(th, RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp)); 
    if (cfp != 0) return cfp->iseq->filepath; 
    return Qnil; 
} 
+0

I (루비 1.9.2 테스트) Rails/Capistrano는 도움이되지 않습니다. 'require_relative' 전에'p 메소드 (: require_relative) .owner'를 추가했습니다. 출력은 Kernel입니다. require_relative가 재정의되었는지를 확인할 수 있습니까? – BernardK

답변

1

http://pragprog.com/book/ruby3/programming-ruby-1-9는 말한다 :

누구의 경로 전화를 포함하는 파일을 기준으로 라이브러리가 필요합니다. 따라서/usr/local/mylib/bin 디렉토리에 myprog.rb 파일이 있고 해당 프로그램에 require_relative "../lib/mylib"그러면 Ruby가 /usr/local에있는 mylib를 찾습니다./mylib/lib. 나는 그런 디렉토리 구조가있는 경우

는 :

a/b/c/d1 
a/b/c/d2 
a/b/c/d2/e/f1 
a/b/c/d2/e/f2 

$ pwd 
a/b/c/d1 
$ ruby -w ../d2/e/f1/test_req_rel 

파일 a/b/c/d2/e/f1/test_req_rel.rb 포함

그래서
require_relative '../f2/req1' 

a/b/c/d2/e/f2에서 검색합니다 통화가 a/b/c/d2/e/f1/test_req_rel.rb에 있으며 '../f2/req1' 다시 의미하기 때문에 f1에서 e까지이고, 그 다음에 f2에서 앞으로,,985,256,이 존재해야하며, 그렇지 않으면 오류 얻을 "그런 파일을로드하지 않으려면 -/A/B/C/C/D/E를 (LoadError)"을

+0

답변을 주셔서 감사합니다.하지만 질문을 많이 수정 했으므로 아직 관심이 있으시면 새 버전을 살펴보십시오. –

관련 문제