代码之家  ›  专栏  ›  技术社区  ›  Cimm

什么时候在Rails中调用“require”?

  •  24
  • Cimm  · 技术社区  · 14 年前

    最好在需要require的方法之前调用它,在类的开头或Rails启动时在初始化器的某个地方对我的requires进行分组?

    谢谢!

    2 回复  |  直到 13 年前
        1
  •  23
  •   tadman    14 年前

    如果您关心性能,那么您应该在需要它们的上下文中要求它们,这样,如果您的代码的那部分没有被执行,那么库就不会被加载。任何后续呼叫 require

    if (user.using_openid?)
      require 'openid'
    
      # ... Do OpenID stuff
    end
    

    虽然这在资源方面更有效,但它会使确定应用程序的依赖关系变得非常困难。预先声明这些可以让维护软件的其他人明白。记住,当你忘记了申请的一些细节时,“其他人”总是包括你未来的自己。

    require 'library1'
    require 'library2'
    require 'library3'
    require 'library4'
    require 'library5'
    
    # Other libraries loaded as required:
    #  * slowimagelibrary
    #  * slowencryptionlibrary
    #  * openid
    

    bundler 因为你可以让你的宝石更正式和真实的申报 要求 电话可以晚点来。

        2
  •  5
  •   eregon    14 年前

    如果您考虑vanillarby,那么“require”主要用于第一行,因为这样您就可以确定您可以访问所需的内容,并且更容易找到和读取所需的依赖关系。

    有一些情况下,您只希望在方法中加载gem,因为脚本不需要这样做(例如,可选的可视化)。

    对于Rails,我相信这取决于你想做什么。

    如果您使用Bundler,您可以假设gem是“必需的”(当然,您可以使用:require选项覆盖必需的内容)。

    如果您想在服务器启动时自动加载某些内容(如验证程序或窗体生成器),那么您应该看看如何使用配置(自动加载路径和紧急加载路径)。

    如果您在多线程环境中工作,您可能会担心,因为这会带来一些问题。然后必须确保在运行线程之前加载了所有内容。(类似类常量的东西被加载了,但是方法还没有,有一篇很好的文章,但是我再也找不到了)。

    您可能还想尝试{Module,Kernel}.autoload,Rails广泛地使用它来加载访问时所需的内容(但它看起来相当难看)。

    这是一个简单的示例(不适用于嵌套类)。

    def Object.const_missing c
      if (file = Dir["#{c.downcase}.rb"]).size == 1 
        require_relative(file)
      end
      if const_defined? c
        const_get c
      else
        super # Object < Module
      end
    end
    

    关于性能,调用require是相对昂贵的,因此如果您知道要使用它,请尽可能只调用一次。但是,要管理项目中的复杂依赖项,可能需要相对文件。那么 require_relative 是1.9的方法。

    最后,对于一个项目,我建议在lib/的主文件中使用all,并使用一些 Dir["**/*.rb"] 表情。那你就不需要了 需要相对的

    另一个解决方案是在主文件中定义这些常量,它还可以让您了解结构。