如何从任何地方要求一些 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/**/"]
【讨论】:
我做到了,但仍然:`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 文件的主要内容,如果未能解决你的问题,请参考以下文章
当我将它链接到我的 Makefile 中时,我可以从 lib 中修剪一些模块吗?