NameError(未初始化的常量Unzipper :: Zip),但仅限于Heroku部署(Rails)

我有一个类unzipper.rb ,它使用Rubyzip解压缩文件。

在我的本地环境中,我可以成功解压缩文件,而不必使用require’zip require 'zip'明确包含依赖项

但是在Heroku上,我得到一个NameError (uninitialized constant Unzipper::Zip) ,我只能通过使用explict require来解决

问题:为什么在Heroku环境中这是必要的,而不是在localhost上? 我的印象是Rails自动需要所有gem。

应用程序/服务/ 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 

运行bundler时Heroku输出包括:

 remote: Using rubyzip 1.1.7 

我validation两者都使用相同版本的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 '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'