【问题标题】:Ruby: how to "require" a file from the current working dir?Ruby:如何“要求”当前工作目录中的文件?
【发布时间】:2012-01-20 14:40:11
【问题描述】:

如何要求当前文件夹中的文件?

我有一个名为sql_parser.rb 的文件,其中包含一个类。我想将它包含在同一文件夹中的另一个文件中,所以我使用了:

require 'sql_parser'

当我从该文件夹运行时失败:

LoadError: no such file to load -- sql_parser

我尝试在此文件所在的文件夹中使用 IRB 并从那里要求它,但遇到了同样的问题。

【问题讨论】:

标签: ruby require


【解决方案1】:

还有……

require "./myRubyFile" # 注意我们从 myRubyFile.rb 中排除了 .rb

【讨论】:

    【解决方案2】:
    $LOAD_PATH << Dir.pwd
    require 'sql_parser'
    

    正如@AndrewGrimm 所说,出于安全原因,您应该改用它:

    $LOAD_PATH << File.join(File.dirname(__FILE__))
    require 'sql_parser'
    

    您的目录必须位于当前加载路径中。加载路径存储在名为$LOAD_PATH 的全局数组中。如果将当前目录附加到它,则可以使用 require 加载目录中的任何文件。

    按照 Tin Man 的建议,使用 Dir.pwd 而不是 pwd.chomp

    我更喜欢这个而不是 require_relative 除非你有一个非常小的项目,否则事情会变得丑陋。

    【讨论】:

    • 干杯。这行得通,但我认为 ruby​​ 总是会在密码中查找,我错了吗?
    • @Matt Roberts 很遗憾没有,但如果您在 Rails 应用程序中工作,所有这些都会为您处理。
    • @MattRoberts:这取决于 ruby​​ 版本。
    • Ruby 的Dir.pwd 可能更直接,因为它不需要打开子shell 或chomp 结果。此外,对于 1.9+,require_relative './sql_parser'require_relative 'sql_parser' 将是我将如何去做
    • $LOAD_PATH &lt;&lt; Dir.pwd$LOAD_PATH &lt;&lt; "." 更不安全吗?至少对于后者,您知道自己在做一些不安全的事情。
    【解决方案3】:

    使用

    $:.unshift File.join(File.dirname(__FILE__))
    

    确保您获得的路径基于脚本所在的位置,而不是程序的执行位置。否则,您将放弃通过从加载路径中删除 "." 获得的安全优势。

    (是的,问题的标题谈到在运行脚本的目录中需要一个文件,但问题的主体提到所需的文件与相关脚本位于同一文件夹中)

    【讨论】:

    • 为什么使用“.”不太安全?另外,为什么不用 Dir.pwd 呢? (它更简洁,完成同样的事情不是吗?)
    • @bkempner:你读过这个问题的 cmets 部分链接的问题吗?
    • @AndrewGrimm,+1 我总是可以依靠你写出消息灵通和正确的答案。感谢您避免使用require_relative。对于那些关心的人,这是加载文件的正确方法
    【解决方案4】:

    正如该问题的其他答案所说,在 1.9 中,语法更改为 require_relative

    如果您使用 Ruby 1.8 编写代码,我建议您以前瞻性的方式编写代码,并使用require_relative gem,这样您就可以在 Ruby 1.8 中使用这个关键字,并在您迁移到1.9

    【讨论】:

    • 这个答案应该是对解决方案的评论,而不是答案。
    【解决方案5】:

    在 ruby​​ 1.9.x 中,您可以使用方法require_relative。见http://www.ruby-doc.org/core-1.9.3/Kernel.html#method-i-require_relative

    【讨论】:

    • 干杯!看起来对我来说是正确的方法(1.9.2)
    猜你喜欢
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 2015-02-22
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 2019-08-26
    相关资源
    最近更新 更多