은 다음과 레일 설치 가정이 예상대로 작동하지 않습니다 다단 확장자를 사용카피 스트라 노 : 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;
}
I (루비 1.9.2 테스트) Rails/Capistrano는 도움이되지 않습니다. 'require_relative' 전에'p 메소드 (: require_relative) .owner'를 추가했습니다. 출력은 Kernel입니다. require_relative가 재정의되었는지를 확인할 수 있습니까? – BernardK