【问题标题】:warning: already initialized constant after installing tlsmail gem?警告:安装 tlsmail gem 后已经初始化常量?
【发布时间】:2014-06-19 17:13:34
【问题描述】:

安装tlsmailgem for email delivery to my gmail账号后,每次运行rake命令都会出现这些错误:

c:/Ruby192/lib/ruby/gems/1.9.1/gems/tlsmail-0.0.1/lib/net/smtp.rb:806: warning: already initialized constant SMTPSession
c:/Ruby192/lib/ruby/gems/1.9.1/gems/tlsmail-0.0.1/lib/net/pop.rb:687: warning: already initialized constant POP
c:/Ruby192/lib/ruby/gems/1.9.1/gems/tlsmail-0.0.1/lib/net/pop.rb:688: warning: already initialized constant POPSession
c:/Ruby192/lib/ruby/gems/1.9.1/gems/tlsmail-0.0.1/lib/net/pop.rb:689: warning: already initialized constant POP3Session
c:/Ruby192/lib/ruby/gems/1.9.1/gems/tlsmail-0.0.1/lib/net/pop.rb:702: warning: already initialized constant APOPSession

我怎样才能摆脱这些警告?


gem 'rails', '3.0.10'
gem "rake", "0.8.7"
gem "pg", "0.12.0"
gem "cancan", "1.6.7"
gem "geocoder", "1.0.5"
gem "will_paginate", "3.0.2"
gem "rails3-jquery-autocomplete"
gem "jquery-rails", "1.0.19"
gem "dynamic_form", "1.1.4"
gem "devise", "1.5.3"
gem "thin", "1.3.1"
gem 'sunspot_rails', '1.2.1'
gem "tlsmail"

【问题讨论】:

  • 您是否安装了另一个与电子邮件相关的 gem,可能声明了类似命名的常量?
  • @normalocity 我不这么认为?我发布了我的 gem 文件。

标签: ruby-on-rails ruby ruby-on-rails-3


【解决方案1】:

如果你不想修改 gem,试试这个:

require 'net/smtp'
Net.instance_eval {remove_const :SMTPSession} if defined?(Net::SMTPSession)

require 'net/pop'
Net::POP.instance_eval {remove_const :Revision} if defined?(Net::POP::Revision)
Net.instance_eval {remove_const :POP} if defined?(Net::POP)
Net.instance_eval {remove_const :POPSession} if defined?(Net::POPSession)
Net.instance_eval {remove_const :POP3Session} if defined?(Net::POP3Session)
Net.instance_eval {remove_const :APOPSession} if defined?(Net::APOPSession)

require 'tlsmail'

预加载net/smtpnet/pop gems 并终止常量可以防止tlsmail 尝试加载和覆盖常量。这是一个肮脏,肮脏的黑客......但它有效!

(Ruby 1.9.2,tlsmail 0.0.1)

【讨论】:

  • @jackocnr 一定要像这样修改你的Gemfile:gem 'tlsmail', require: false并将上面的内容放在config/initializers/tlsmail.rb中,例如
  • require: false 是我所缺少的。谢谢@aceofspades
【解决方案2】:

至少,看起来,你并不孤单。我对那个宝石不是很熟悉,但看起来这可能是你的修复:http://blog.snootymonkey.com/post/892799550/already-initialized-constant-warnings

ActionMailer(或其他一些邮件程序代码/插件)可能默认包含在 Rails 3 中。不要引用我的话,但就冲突名称可能来自何处而言,这是我未经证实的预感.

【讨论】:

    【解决方案3】:

    tlsmail 是 ruby​​ 1.9 邮件到 1.8 的反向移植。所以你在 ruby​​ 1.9 或更高版本中不需要 tlsmail。

    这个库在 ruby​​ 1.9 中动态替换 net/smtp 和 net/pop 和 通过 SSL/TLS 启用 pop 或 smtp。

    http://rubydoc.info/gems/tlsmail/0.0.1/frames

    【讨论】:

      猜你喜欢
      • 2011-01-02
      • 2011-08-29
      • 2011-11-29
      • 2012-10-08
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      • 2011-08-20
      • 2019-05-23
      相关资源
      最近更新 更多