【问题标题】:How to deal with vendor/plugins after upgrading to rails 3.2.1升级到 rails 3.2.1 后如何处理供应商/插件
【发布时间】:2012-02-24 19:46:56
【问题描述】:

升级到 rails3.2.1 后,出现此警告:

您在 vendor/plugins 中有 Rails 2.3 风格的插件! Rails 4.0 将删除对这些插件的支持。将它们移出并将它们捆绑到您的 Gemfile 中,或者将它们作为 lib/myplugin/* 和 config/initializers/myplugin.rb 折叠到您的应用程序中。有关更多信息,请参阅发行说明:http://weblog.rubyonrails.org/2012/1/4/rails-3-2-0-rc2-has-been-released

我将我的插件移动到 vendor/plugins 目录但我不知道如何编写 config/initializers/myplugin.rb 文件,并且谷歌找不到答案。

【问题讨论】:

    标签: ruby-on-rails plugins warnings ruby-on-rails-3.2


    【解决方案1】:

    【讨论】:

    • 非常感谢您的博文!我刚刚使用您的出色说明成功转换了gmail_smtp。如果对任何人有帮助,我将原始init.rb 中的两行从require 'smtp_tls'require 'actionmailer_gmail' 分别更改为require File.dirname(__FILE__) + '/../../lib/gmail_smtp/smtp_tls'require File.dirname(__FILE__) + '/../../lib/gmail_smtp/actionmailer_gmail'
    • 链接失效了,能否请你发一个新的@coneybeare。
    【解决方案2】:

    我刚刚浏览了一下,发现你只需要浏览每个插件来检查一些事情:

    • 它是红宝石上的宝石吗?如果是这样,只需将其粘贴到您的 Gemfile 中并从 vendor/plugins 中删除
    • 如果没有可用的gem,或者gem 太旧,则将vendor/plugins 中的文件夹移至lib/plugins

    我遇到的一件事是您需要手动要求所有这些插件。这是我创建并放在config/initializers/plugins.rb 中的初始化程序:

    Dir[Rails.root.join('lib', 'plugins', '*')].each do |plugin|
      next if File.basename(plugin) == 'initializers'
    
      lib = File.join(plugin, 'lib')
      $LOAD_PATH.unshift lib
    
      begin
        require File.join(plugin, 'init.rb')
      rescue LoadError
        begin
          require File.join(lib, File.basename(plugin) + '.rb')
        rescue LoadError
          require File.join(lib, File.basename(plugin).underscore + '.rb')
        end
      end
    
      initializer = File.join(File.dirname(plugin), 'initializers', File.basename(plugin) + '.rb')
      require initializer if File.exists?(initializer)
    end
    

    我还遇到了一些插件所需的初始化程序的问题,所以我将这些特定的初始化程序移到了lib/plugins/initializers 文件夹中。您必须将它们命名为插件的名称,因此 my_plugin 插件的初始化程序必须在文件 lib/plugins/initializers/my_plugin.rb

    希望这会有所帮助!

    【讨论】:

    • 如果一个人重写了 gem 的控制器,如何将它移动到 lib 中?
    【解决方案3】:

    其他两个答案都很好并且似乎有效。

    但是,如果您的插件由 vendor/plugins/.../lib 下的单个 .rb 文件组成,而 vendor/plugins/.../init.rb 只是一个

    require 'pluginname'
    

    然后,您可以简单地将单个文件复制到您的 lib 目录,并将一个文件添加到 config/initializers 中,该文件需要 'yourpluginname'

    这是一个使用acts_as_rated 插件的具体示例,它还不是一个gem。

    1. 将 vendor/plugins/acts_as_rated/lib/acts_as_rated.rb 复制到 lib/

    2. 使用以下内容创建文件 config/initializers/acts_as_rated.rb...

      需要'acts_as_rated'

    3. 删除供应商/插件/acts_as_rated

    【讨论】:

      【解决方案4】:

      没有人提到转换为 Railtie 或 Rails::Engine。

      只需将所有 ruby​​ 文件移动到 gem [使用 bundle gem 创建它以减少摩擦]。

      然后查看 Railtie 文档 [并找到您的目标 Rails 版本]:

      https://apidock.com/rails/v3.2.13/Rails/Railtie

      以这种方式将旧插件 init.rb 转换为 railtie 非常容易,它为您提供了通往 Rails 4+ 的途径。

      有视图或控制器吗?然后使用 Rails::Engine 代替。虽然从工作流程的角度来看 gems 中的引擎可能很复杂,但将插件转换为一个插件非常简单。

      帮自己一个忙,开始在 gem 中构建测试,而不是在 Rails 项目中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-06
        • 1970-01-01
        • 2019-06-21
        相关资源
        最近更新 更多