【问题标题】:Why am I getting a 'NameError: uninitialized constant Dotenv' when deploying to Heroku?为什么我在部署到 Heroku 时收到“NameError: uninitialized constant Dotenv”?
【发布时间】:2021-12-06 09:54:11
【问题描述】:

我正在尝试将一个简单的 Ruby 应用程序部署到 Heroku。我在发布日志中不断收到此错误,如下所示:

rake aborted!
NameError: uninitialized constant Dotenv
/app/config/environment.rb:5:in `<top (required)>'
/app/Rakefile:3:in `require_relative'
/app/Rakefile:3:in `<top (required)>'
/app/vendor/bundle/ruby/2.7.0/gems/rake-13.0.1/exe/rake:27:in `<top (required)>'
/app/vendor/bundle/ruby/2.7.0/gems/bundler-2.2.21/lib/bundler/cli/exec.rb:63:in `load'
/app/vendor/bundle/ruby/2.7.0/gems/bundler-2.2.21/lib/bundler/cli/exec.rb:63:in `kernel_load'
/app/vendor/bundle/ruby/2.7.0/gems/bundler-2.2.21/lib/bundler/cli/exec.rb:28:in `run'
/app/vendor/bundle/ruby/2.7.0/gems/bundler-2.2.21/lib/bundler/cli.rb:474:in `exec'
/app/vendor/bundle/ruby/2.7.0/gems/bundler-2.2.21/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
/app/vendor/bundle/ruby/2.7.0/gems/bundler-2.2.21/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/app/vendor/bundle/ruby/2.7.0/gems/bundler-2.2.21/lib/bundler/vendor/thor/lib/thor.rb:392:in `dispatch'
/app/vendor/bundle/ruby/2.7.0/gems/bundler-2.2.21/lib/bundler/cli.rb:30:in `dispatch'
/app/vendor/bundle/ruby/2.7.0/gems/bundler-2.2.21/lib/bundler/vendor/thor/lib/thor/base.rb:485:in `start'
/app/vendor/bundle/ruby/2.7.0/gems/bundler-2.2.21/lib/bundler/cli.rb:24:in `start'
/app/vendor/bundle/ruby/2.7.0/gems/bundler-2.2.21/exe/bundle:49:in `block in <top (required)>'
/app/vendor/bundle/ruby/2.7.0/gems/bundler-2.2.21/lib/bundler/friendly_errors.rb:128:in `with_friendly_errors'
/app/vendor/bundle/ruby/2.7.0/gems/bundler-2.2.21/exe/bundle:37:in `<top (required)>'
/app/vendor/bundle/bin/bundle:113:in `load'
/app/vendor/bundle/bin/bundle:113:in `<main>'
(See full trace by running task with --trace)

我已经用谷歌搜索了一堆并尝试了每一个建议,但我似乎无法解决它。作为参考,这是我的 Gemfile:

source 'http://rubygems.org'

gem 'sinatra'
gem 'activerecord', "< 6", :require => 'active_record'
gem 'sinatra-activerecord', :require => 'sinatra/activerecord'
gem 'rake'
gem 'require_all'
gem 'thin'
gem 'bcrypt'
gem 'sinatra-flash'
gem 'rails_12factor'
gem 'foreman'

group :development, :test do 
  gem 'sqlite3', '<1.4'
  gem 'shotgun'
  gem 'tux'
  gem 'pry'
  gem 'session_secret_generator'
  gem 'dotenv'
end

group :production do 
  gem 'pg', '0.20'
end

group :test do
  gem 'rspec'
  gem 'capybara'
  gem 'rack-test'
  gem 'database_cleaner', git: 'https://github.com/bmabey/database_cleaner.git'
end

这是我的 config/environment.rb:

ENV['SINATRA_ENV'] ||= "development"

require 'bundler/setup'
Bundler.require(:default, ENV['SINATRA_ENV'])
Dotenv.load if ENV['SINATRA_ENV'] == "development"

set :database_file, "./database.yml"

require './app/controllers/application_controller'
require_all 'app'

谢谢!

【问题讨论】:

    标签: ruby heroku dotenv


    【解决方案1】:

    问题

    请注意,您的 Gemfile 将 dotenv 放入您的 :development 和 :test 组。它在您的默认组或 :production 组中不可用,因此您不太可能按照当前配置通过 Bundler.require 加载您的 gem。

    建议的解决方案

    我的建议包括:

    1. 确保您使用 APP_ENV 设置您的 Sinatra 环境,而不是像 SINATRA_ENV 这样的自定义设置,它可能会或可能不会按照您对 Heroku 的想法进行
    2. 在生产环境中使用 Heroku's config-vars 而不是 dotenv
    3. 注意Heroku probably defaults to excluding :development, :test, and :ci groups 在运行bundle install 时,但您可以通过环境变量配置此行为
    4. 将 dotenv 移至您的默认组(如果您确实需要它)
    5. 如果您不将 dotenv 移动到默认组中,则需要修改 Bundler.require 以将包含 dotenv gem 的正确组添加到需要的组列表中(前提是 Bundler 已安装该组)

    您可能还有其他问题,但这些是从您提供的代码和错误中跳出来的问题。

    【讨论】:

    • 将 dotenv 移动到默认组并要求 environment.rb 中的 dotenv 有效!原来是一个简单的解决方案;我想这只是事物的正确组合。谢谢!
    • @fmp19 很高兴它解决了您的问题。不要忘记投票并标记您接受的答案,以便将来也可以帮助其他人。
    【解决方案2】:

    也许你错过了:在尝试 Dotenv.load 之前需要 'dotenv'?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-07
      相关资源
      最近更新 更多