gpt4 book ai didi

ruby - Capistrano:require_relative 没有按预期工作

转载 作者:数据小太阳 更新时间:2023-10-29 07:38:11 24 4
gpt4 key购买 nike

假设以下 Rails 设置:

  • 轨道 3.2.9
  • Capistrano 2.13.5
  • 使用多级扩展(即 capistrano/ext/multistage)
  • 定义的生产阶段,例如在 Rails.root/config/deploy/production.rb 中。

在 production.rb 中,你不能使用 require_relative,看起来——你最终会收到“无法推断基本路径”错误。但是,如果您只是普通的 ruby production.rb,则 require_relative 可以正常工作。

为什么会这样?似乎 Capistrano 加载/执行代码的方式使得 require_relative 无法按预期工作。

我怀疑这类似于:Passenger Rack app 'cannot infer basepath' ,这(粗略地说)表明 require_relative 可能会失败,具体取决于代码的最终加载/运行方式。

下面给出了分支 ruby​​_1_9_3 中 require_relative 的源代码,它显示了 require_relative 是如何依赖于调用堆栈的。然而,端到端的图景并不完整——Capistrano 如何查找和执行代码,以及这如何影响调用堆栈。

我不认为这里有任何问题是无法解决的,但是为了代替我自己深入研究这个问题,任何专家对正在发生的事情的见解都将不胜感激,不仅是针对具体问题,而且是为了深入了解如何Cap 和 Ruby 工作。

// 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;
}

最佳答案

http://pragprog.com/book/ruby3/programming-ruby-1-9说:

Requires a library whose path is relative to the file containing the call. Thus, if the directory /usr/local/mylib/bin contains the file myprog.rb and that program contains the following line: require_relative "../lib/mylib" then Ruby will look for mylib in /usr/local/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前进,其中req1.rb 必须存在,否则会出现错误“没有要加载的文件 --/a/b/c/c/d/e (LoadError)”

(使用 Ruby 1.9.2 测试)

关于ruby - Capistrano:require_relative 没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13612693/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com