如何从任何地方要求一些 lib 文件

Posted

技术标签:

【中文标题】如何从任何地方要求一些 lib 文件【英文标题】:How to require some lib files from anywhere 【发布时间】:2013-07-30 20:04:57 【问题描述】:

我会解释一下我的情况。

这是我在 Rails 应用程序中的文件树:

lib/my_module.rb

require 'my_module/my_file'

module My_module

end

lib/my_module/my_file.rb

class Tweetag::Collector
   (...)
end

我已经制作了一个 ruby​​ 脚本,并将其放入 config/jobs/

我真的不明白我应该如何在这个文件中要求文件 my_file.rb。

require '../../my_module/my_file.rb'

它给了我`require':无法加载这样的文件

同样的错误只需要'my_module',这是我在我的控制器中所做的......

有人来给我解释一下吗?非常感谢

【问题讨论】:

【参考方案1】:

您可以自动包含 lib folder 下的所有内容并避免这些问题:

config/application.rb中输入您的文件

config.autoload_paths += %W(#config.root/lib)
config.autoload_paths += Dir["#config.root/lib/**/"]

【讨论】:

我做到了,但仍然:`
': uninitialized constant MyModule (NameError)
现在在你需要的地方包含你的模块,include My_module 您声明了My_module,但您使用的是MyModule。修复此不一致。但是惯例是为您定义的模块使用MyModule 表单 其实你可以用“Tweetag”替换所有的“my_module”,用“Collector”替换所有的“my_file”。我试图在我的解释中笼统,但我失败了。无论如何,当我“包含 Tweetag”时,它不起作用。 在带有 Rails 5.2.2 的生产服务器上,您可能需要使用 config.eager_load_paths += %W(#config.root/lib)【参考方案2】:

如果您只想需要一个特定的文件,那么, 像这样与 Rails root 相关的事情

for example: --

lib/plan.rb

module Plan
 ...some code...
end

如果您只想在某些模型中使用它,请说 app/models/user.rb

在用户模型中做

require "#Rails.root/lib/plan"

class User < ActiveRecord::Base
  include Plan
end

如果您希望它随处可用

@VecchiaSpugna 给出了一个解决方案

或者你可以在 config/initializers 文件夹中创建一个 ruby​​ 文件

并要求那里的所有文件一个接一个

try this

require '../../my_module/my_file'

instead of 

require '../../my_module/my_file.rb'

您不需要在 require 中指定文件的扩展名。

【讨论】:

其实我只是明白我不能像你刚才说的那样做一些特定于 Rails 的事情。我只是想运行命令行“ruby my_ruby_script.rb”并在其中需要我的lib模块。 require Rails.root.join('lib', 'plan') 不是更习惯吗?【参考方案3】:

我认为有两种解决方案。

1) 将 lib 路径添加到搜索路径。 在红宝石中:

$:.unshift('../../my_module/lib')

那你可以require 'my_module.rb'

我认为Vecchia Spugna answer 是我的 ruby​​-answer 的 rails 版本。 (我不熟悉 Rails)。

2) 另一种解决方案:

在您的lib/my_module.rb 中,您需要my_file。该文件相对于您的my_module.rb?然后使用require_relative:

require_relative './my_module/my_file'

【讨论】:

1) 是要走的路,因为 config/jobs 中的作业似乎不是从他的 rails 应用程序中启动的。因此,他必须按照您的描述自己设置加载路径,而不是期望未使用的 rails 环境会为他执行此操作。【参考方案4】:

只是插话,因为我花了很长时间才弄清楚这一点,因为很少有解决方案奏效。

• 我不得不使用普通的旧要求。我把它放在config/application.rb 文件中。

patching_file_path = File.expand_path("./lib", Dir.pwd) Dir[patching_file_path+'/*.rb'].each |file| require file

• 我还在我试图要求的文件中放置了一个临时的puts "I'm Working!,以便我可以检查控制台以查看它是否实际加载。

• 此外,如果您使用的是 spring 加载程序,则在启动控制台之前,您应该在启动 rails 控制台之前在终端中执行bin/spring stop。否则,它不会加载新文件。

【讨论】:

我也被这个问题困扰了一段时间。停止 Spring 对我有用。干杯!【参考方案5】:

类似于require_relative,

# inside lib/my_module.rb 
require File.expand_path('./my_module/my_file', File.dirname(__FILE__))

这会扩展当前文件目录的路径并添加所需的相对文件路径。

【讨论】:

以上是关于如何从任何地方要求一些 lib 文件的主要内容,如果未能解决你的问题,请参考以下文章

通过 NetworkStream 传输档案

当我将它链接到我的 Makefile 中时,我可以从 lib 中修剪一些模块吗?

具有一些特定要求的 .NET 中的录音

一个C++项目, 已有一些静态库(.lib)和所有的函数声明(.h),怎么生成一个动态库(dll)

如何构建音频文件流 iPhone 应用程序?

如何从任何地方运行作曲家?