【问题标题】:uninitialized constant AWS (NameError) after bundle update in Ruby在 Ruby 中更新包后未初始化的常量 AWS (NameError)
【发布时间】:2025-12-04 12:35:01
【问题描述】:

在我用 Ruby 更新捆绑包后,我现在完全对 AWS NameError 感到困惑。命令是包更新。

下面是我的 Gemfile.lock

DEPENDENCIES
  actionmailer_inline_css
  aws-sdk

...

awesome_print (1.6.1)
    aws-sdk (2.3.9)
      aws-sdk-resources (= 2.3.9)
    aws-sdk-core (2.3.9)
      jmespath (~> 1.0)
    aws-sdk-resources (2.3.9)
      aws-sdk-core (= 2.3.9)

.

我的 Gemfile 包括

gem 'aws-sdk'

但是我不知道为什么突然出现这个问题。之前有没有人遇到过这个问题并最终修复了这个错误?请与我分享!我急于解决这个问题..

我在初始化程序中有 aws.rb 文件。

AWS.config(
    #:access_key_id => ENV['AWS_ACCESS_KEY_ID'],
    :access_key_id => 'XX',
    #:secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
    :secret_access_key => 'X/X/X/X'
    )

#S3_BUCKET = AWS::S3.new.buckets[ENV['S3_BUCKET']]
S3_BUCKET = AWS::S3.new.buckets['XX']

Ruby 版本是 2.1.5 输入 rails s 时的整个错误信息如下:

/Users/sungpah/XX/config/initializers/aws.rb:1:in `<top (required)>': uninitialized constant AWS (NameError)
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/railties-4.2.1/lib/rails/engine.rb:652:in `block in load_config_initializer'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/activesupport-4.2.1/lib/active_support/notifications.rb:166:in `instrument'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/railties-4.2.1/lib/rails/engine.rb:651:in `load_config_initializer'
from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/railties-4.2.1/lib/rails/engine.rb:652:in `block in load_config_initializer'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/activesupport-4.2.1/lib/active_support/notifications.rb:166:in `instrument'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/railties-4.2.1/lib/rails/engine.rb:651:in `load_config_initializer'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/railties-4.2.1/lib/rails/engine.rb:616:in `block (2 levels) in <class:Engine>'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/railties-4.2.1/lib/rails/engine.rb:615:in `each'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/railties-4.2.1/lib/rails/engine.rb:615:in `block in <class:Engine>'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/railties-4.2.1/lib/rails/initializable.rb:30:in `instance_exec'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/railties-4.2.1/lib/rails/initializable.rb:30:in `run'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/railties-4.2.1/lib/rails/initializable.rb:55:in `block in run_initializers'
    from /Users/sungpah/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:226:in `block in tsort_each'
    from /Users/sungpah/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:348:in `block (2 levels) in each_strongly_connected_component'
    from /Users/sungpah/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:418:in `block (2 levels) in each_strongly_connected_component_from'
    from /Users/sungpah/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:427:in `each_strongly_connected_component_from'
    from /Users/sungpah/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:417:in `block in each_strongly_connected_component_from'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/railties-4.2.1/lib/rails/initializable.rb:44:in `each'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/railties-4.2.1/lib/rails/initializable.rb:44:in `tsort_each_child'
    from /Users/sungpah/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:411:in `call'
    from /Users/sungpah/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:411:in `each_strongly_connected_component_from'
    from /Users/sungpah/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:347:in `block in each_strongly_connected_component'
    from /Users/sungpah/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:345:in `each'
    from /Users/sungpah/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:345:in `call'
    from /Users/sungpah/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:345:in `each_strongly_connected_component'
    from /Users/sungpah/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:224:in `tsort_each'
    from /Users/sungpah/.rvm/rubies/ruby-2.1.5/lib/ruby/2.1.0/tsort.rb:205:in `tsort_each'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/railties-4.2.1/lib/rails/initializable.rb:54:in `run_initializers'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/railties-4.2.1/lib/rails/application.rb:352:in `initialize!'
    from /Users/sungpah/ringle/config/environment.rb:5:in `<top (required)>'
    from /Users/sungpah/ringle/config.ru:3:in `block in <main>'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/rack-1.6.4/lib/rack/builder.rb:55:in `instance_eval'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/rack-1.6.4/lib/rack/builder.rb:55:in `initialize'
    from /Users/sungpah/ringle/config.ru:in `new'
    from /Users/sungpah/ringle/config.ru:in `<main>'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/rack-1.6.4/lib/rack/builder.rb:49:in `eval'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/rack-1.6.4/lib/rack/builder.rb:49:in `new_from_string'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/rack-1.6.4/lib/rack/builder.rb:40:in `parse_file'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/rack-1.6.4/lib/rack/server.rb:299:in `build_app_and_options_from_config'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/rack-1.6.4/lib/rack/server.rb:208:in `app'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/railties-4.2.1/lib/rails/commands/server.rb:61:in `app'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/rack-1.6.4/lib/rack/server.rb:336:in `wrapped_app'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/railties-4.2.1/lib/rails/commands/server.rb:139:in `log_to_stdout'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/railties-4.2.1/lib/rails/commands/server.rb:78:in `start'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/railties-4.2.1/lib/rails/commands/commands_tasks.rb:80:in `block in server'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/railties-4.2.1/lib/rails/commands/commands_tasks.rb:75:in `tap'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/railties-4.2.1/lib/rails/commands/commands_tasks.rb:75:in `server'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/railties-4.2.1/lib/rails/commands/commands_tasks.rb:39:in `run_command!'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/railties-4.2.1/lib/rails/commands.rb:17:in `<top (required)>'
    from /Users/sungpah/ringle/bin/rails:8:in `require'
    from /Users/sungpah/ringle/bin/rails:8:in `<top (required)>'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/spring-1.7.1/lib/spring/client/rails.rb:28:in `load'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/spring-1.7.1/lib/spring/client/rails.rb:28:in `call'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/spring-1.7.1/lib/spring/client/command.rb:7:in `call'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/spring-1.7.1/lib/spring/client.rb:30:in `run'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/spring-1.7.1/bin/spring:49:in `<top (required)>'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/spring-1.7.1/lib/spring/binstub.rb:11:in `load'
    from /Users/sungpah/.rvm/gems/ruby-2.1.5/gems/spring-1.7.1/lib/spring/binstub.rb:11:in `<top (required)>'
    from /Users/sungpah/ringle/bin/spring:13:in `require'
    from /Users/sungpah/ringle/bin/spring:13:in `<top (required)>'
    from bin/rails:3:in `load'
    from bin/rails:3:in `<main>'

【问题讨论】:

  • 抱歉,我没有看到真正的错误。
  • 错误是什么?
  • 对不起,我刚刚更新了!它不见了! (第一行报错)
  • 看到这个线程有同样的问题。 *.com/a/49222325/1625253

标签: ruby-on-rails ruby amazon-web-services


【解决方案1】:

问题是对于版本 2 AWS SDK,您必须使用“Aws”而不是“AWS”,请参见下文,使用以下代码。 AWS 开发工具包版本 2 使用“Aws”命名空间,而不是“AWS”。

    Aws.config(
    #:access_key_id => ENV['AWS_ACCESS_KEY_ID'],
    :access_key_id => 'XXXXXXXXX',
    #:secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
    :secret_access_key => 'XXXXXXX'
    )

#S3_BUCKET = AWS::S3.new.buckets[ENV['S3_BUCKET']]
S3_BUCKET = Aws::S3.new.buckets['ringlecourse']

另请阅读此文档以了解 AWS 开发工具包升级 http://docs.aws.amazon.com/sdkforruby/api/

【讨论】:

    【解决方案2】:

    将 aws.rb 中的初始化代码更改为

    Aws.config.update({
      credentials: Aws::Credentials.new(
        ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY'])
    })
    

    Reference

    【讨论】:

      【解决方案3】:

      从 Amazon AWS SDK v1 升级到 v2 包含一些惊喜。最直接影响的惊喜是名称 AWS 更改为 Aws,需要更改代码才能简单地更新 gem。

      AWS SDK for Ruby - Version 2 指南将帮助您了解详细信息。本指南的第一个条目涉及您遇到的 NameError: uninitialized constant AWS 错误。 AWS SDK v2 的更改、功能和改进列表的概述记录在 Announcing V2 of the AWS SDK for Ruby 中,值得一读以了解会发生什么。

      请注意,如果您愿意,可以继续使用 AWS SDK v1 和 AWS SDK v2 gem,只需在您的Gemfile 中包含这两个 gem:

      gem 'aws-sdk', '~> 2'
      gem 'aws-sdk-v1'
      

      这将使您现有的代码无需更改即可工作。这绝对是一件好事。请注意,要继续使用 v1 gem,您现在必须在 Gemfile 中将其称为 aws-sdk-v1。这是一个不错的功能,可以让您按照自己的计划完全迁移到 v2 gem,同时仍然能够立即使用新的 v2 功能。

      退后一步,考虑一下您是否完全了解新 gem 中的内容,以及为什么要升级。一旦你这样做了,你可能会发现现在根本不是升级的合适时间。新版本并不总是更好,有时升级组件会严重影响项目。考虑咬掉一个小型研究项目来调查升级到 gem 版本的真正影响;您可能会发现它甚至没有必要,特别是如果您没有专门使用新 gem 版本功能的要求。

      【讨论】:

      • 这是该问题的最佳答案。