- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
假设以下 Rails 设置:
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/
这很难用谷歌搜索。我有一个文件位于 /folder_1/folder_2/folder_3/my_ruby_file_to_be_executed.rb 在那个文件里面我需要这个文件 /folder_
我用二进制构建了一个 ruby gem。我这样使用: myruby "param" 它是构建集成的帮助程序,需要为每个项目进行设置。我在 settings.rb 中有几个项目的设置。是否可以根据当
我正在尝试加载我最近创建的新 gem,但还没有任何代码,因为当我尝试加载只是为了测试时出现了这个错误。 我的代码:我的 gem 名称是 tracky。 tracky.gemspec lib = Fil
我正在尝试使用 JRuby 在 Tomcat 中启动 Sinatra 应用程序。简单的东西是可行的,但是一旦我输入带有 require_relative 的东西,我就会得到: main:Object
假设以下 Rails 设置: 轨道 3.2.9 Capistrano 2.13.5 使用多级扩展(即 capistrano/ext/multistage) 定义的生产阶段,例如在 Rails.root
我一直在使用一个教程,该教程对一个没有文件扩展名的文件使用 require。 即: onefile.rb: require "secondfile" secondfile.rb: xxx
鉴于 require_relative 接受相对路径和绝对路径,是否有任何理由特别使用仅接受绝对路径的 require?能不能把所有的require都换成require_relative? 编辑 Se
这是我的 ruby 脚本: require_relative 'lib/say.rb' say("hello") 我通过 :w 从 macvim 运行它! ruby 并得到: :w ! ruby -:
假设我有以下两个文件: app.rb class App def a "a" end require_relative 'b' end b.rb class App def b
在 Rails 4.2.5 中,在 app/config/application.rb 中,我注意到文件顶部的这段代码: require File.expand_path('../boot', __F
通过“Well Grounded Rubyist”一书和一些代码示例,您可以使用 require 来加载文件。不幸的是,当使用 require "stacklike" 我得到这个错误 "/home/u
在尝试更新 OpenSSL 时 - 我(似乎)破坏了笔记本电脑上 Ruby 和 Rails 的所有内容。即使在通过 gem uninstall 和 rvm remove 卸载 ruby 和 rai
我不明白导入库或模块的三种方法之间的区别。据我目前的了解, load 'file.rb' 会将外部文件的内容导入当前文件而: require 'file.rb' 将执行相同的功能,但不会导入已经导入的
Ruby 中的 require_relative 和 require 有什么区别? 最佳答案 看看docs : require_relative complements the builtin met
我已经尝试了 Stackoverflow 上提供的与此错误相关的解决方案。我还通过重建我的 gem 尝试了一种反复试验的方法,但错误仍然存在。 错误如下: ./bin/coding-schools
我已经从我的命令行中获得了一切,所以我可以运行 ruby myfile 并且它可以正常工作。但是当我尝试从 sublime 中运行它时,我得到了 undefined method `require_r
我现在在 Dropbox/96_2013/work/ror/dmc/dmStaffing/QA/selenium_server_wyatt/spec/2day/units/ 我可以进入 irb 并需要
任何 rails 命令对我都不起作用。我通过 rvm 安装了几个版本的 ruby。我尝试安装所有版本的 rails,它们确实安装成功,但是对于所有版本,每当我在项目目录中运行 any rails
任何 rails 命令对我都不起作用。我通过 rvm 安装了几个版本的 ruby。我尝试安装所有版本的 rails,它们确实安装成功,但是对于所有版本,每当我在项目目录中运行 any rails
我试图从我的 Ubuntu 机器上向 Gitlab 提交一些东西,我收到以下错误。 user@user-laptop:$ git push Username for '*************':
我是一名优秀的程序员,十分优秀!