NameError(未初始化常量 Unzipper::Zip)但仅在 Heroku 部署时出现(Rails)
NameError (uninitialized constant Unzipper::Zip) but only on Heroku deploy (Rails)
我有一个 class unzipper.rb
使用 Rubyzip 解压缩文件。
在我的本地环境中,我可以成功解压缩文件,而无需使用 require 'zip'
显式包含依赖项
不过在 Heroku 上,我得到一个 NameError (uninitialized constant Unzipper::Zip)
,我只能通过使用明确的 require
来解决
问题: 为什么这在 Heroku 环境中是必需的,但在本地主机上却不是?我的印象是 Rails 自动需要所有宝石。
app/services/unzipper.rb
require 'zip' # Only required for Heroku. Works locally without!
class Unzipper
OVERRIDE_FILES = true
def initialize(file)
@file = file
end
def self.unzip(file, &block)
Unzipper.new(file).unzip(&block)
end
def unzip
open_zip do |zip|
yield extract_files(zip)
end
end
private
def open_zip(&block)
::Zip::File.open(@file.path, &block)
end
def extract_files(zip)
files = []
zip.each do |entry|
path = "#{rails_temp_directory}/#{entry.name}"
entry.extract(path) { OVERRIDE_FILES }
files << path
end
files
end
def rails_temp_directory
"#{Rails.root}/tmp"
end
end
当 运行 捆绑器包括时的 Heroku 输出:
remote: Using rubyzip 1.1.7
我确认两者都使用相同版本的 Ruby。
Rubyzip 没有初始化程序或环境配置。
Gemfile
source 'https://rubygems.org'
gem 'rails', '4.2.0'
gem 'pg', group: :production
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.1.0'
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'
gem 'sdoc', '~> 0.4.0', group: :doc
gem 'slim-rails'
gem 'paperclip'
gem 'rest-client'
gem 'bootstrap-sass', '~> 3.3.3'
gem 'validates_serialized'
gem 'puma'
gem "nokogiri"
gem "cocoon"
gem 'sidekiq'
gem 'sinatra', :require => nil # For sidekiq web monitoring
gem 'aws-sdk', '< 2.0'
gem 'rails_12factor', group: :production
gem 'rubyzip'
group :development, :test do
gem 'byebug'
gem 'web-console', '~> 2.0'
gem 'spring'
gem 'sqlite3'
gem 'shoulda-matchers'
gem 'rspec-rails'
gem 'factory_girl_rails'
gem 'capybara'
gem 'selenium-webdriver'
gem 'database_cleaner'
gem 'guard-rspec'
gem 'faker'
end
group :test do
gem 'webmock'
end
ruby '2.2.0'
Rubyzip 的主文件名与其 gem 名称不同,因此您可能必须在 Gemfile 中明确指定:
gem 'rubyzip', require: 'zip'
我有一个 class unzipper.rb
使用 Rubyzip 解压缩文件。
在我的本地环境中,我可以成功解压缩文件,而无需使用 require 'zip'
不过在 Heroku 上,我得到一个 NameError (uninitialized constant Unzipper::Zip)
,我只能通过使用明确的 require
问题: 为什么这在 Heroku 环境中是必需的,但在本地主机上却不是?我的印象是 Rails 自动需要所有宝石。
app/services/unzipper.rb
require 'zip' # Only required for Heroku. Works locally without!
class Unzipper
OVERRIDE_FILES = true
def initialize(file)
@file = file
end
def self.unzip(file, &block)
Unzipper.new(file).unzip(&block)
end
def unzip
open_zip do |zip|
yield extract_files(zip)
end
end
private
def open_zip(&block)
::Zip::File.open(@file.path, &block)
end
def extract_files(zip)
files = []
zip.each do |entry|
path = "#{rails_temp_directory}/#{entry.name}"
entry.extract(path) { OVERRIDE_FILES }
files << path
end
files
end
def rails_temp_directory
"#{Rails.root}/tmp"
end
end
当 运行 捆绑器包括时的 Heroku 输出:
remote: Using rubyzip 1.1.7
我确认两者都使用相同版本的 Ruby。
Rubyzip 没有初始化程序或环境配置。
Gemfile
source 'https://rubygems.org'
gem 'rails', '4.2.0'
gem 'pg', group: :production
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.1.0'
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'
gem 'sdoc', '~> 0.4.0', group: :doc
gem 'slim-rails'
gem 'paperclip'
gem 'rest-client'
gem 'bootstrap-sass', '~> 3.3.3'
gem 'validates_serialized'
gem 'puma'
gem "nokogiri"
gem "cocoon"
gem 'sidekiq'
gem 'sinatra', :require => nil # For sidekiq web monitoring
gem 'aws-sdk', '< 2.0'
gem 'rails_12factor', group: :production
gem 'rubyzip'
group :development, :test do
gem 'byebug'
gem 'web-console', '~> 2.0'
gem 'spring'
gem 'sqlite3'
gem 'shoulda-matchers'
gem 'rspec-rails'
gem 'factory_girl_rails'
gem 'capybara'
gem 'selenium-webdriver'
gem 'database_cleaner'
gem 'guard-rspec'
gem 'faker'
end
group :test do
gem 'webmock'
end
ruby '2.2.0'
Rubyzip 的主文件名与其 gem 名称不同,因此您可能必须在 Gemfile 中明确指定:
gem 'rubyzip', require: 'zip'