diff --git a/CHANGELOG.md b/CHANGELOG.md index 8631d9776..17edfd88f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,9 @@ powerful plugins for Vagrant while providing a backwards-compatible API so that plugins will always _load_ (though they will almost certainly not be _functional_ in future versions of Vagrant). + - Plugins no longer "autoload" by simply gem installing them. This increases + Vagrant's initial startup time considerably. To replace this, you can use + the `vagrant plugin` interface. - Improve the SSH "ready?" check. [GH-841] - Human friendly error if connection times out for HTTP downloads. [GH-849] - Detect when the VirtualBox installation is incomplete and error. [GH-846] diff --git a/lib/vagrant/environment.rb b/lib/vagrant/environment.rb index f6a0459d3..220ddc5f1 100644 --- a/lib/vagrant/environment.rb +++ b/lib/vagrant/environment.rb @@ -519,7 +519,7 @@ module Vagrant ::Gem.clear_paths # Load the plugins - Plugin::GemLoader.load! + # XXX: TODO end end end diff --git a/lib/vagrant/plugin.rb b/lib/vagrant/plugin.rb index bbfcdbfe5..de85c72ac 100644 --- a/lib/vagrant/plugin.rb +++ b/lib/vagrant/plugin.rb @@ -1,7 +1,5 @@ module Vagrant module Plugin - autoload :GemLoader, "vagrant/plugin/gem_loader" - autoload :V1, "vagrant/plugin/v1" end end diff --git a/lib/vagrant/plugin/gem_loader.rb b/lib/vagrant/plugin/gem_loader.rb deleted file mode 100644 index ca95eec60..000000000 --- a/lib/vagrant/plugin/gem_loader.rb +++ /dev/null @@ -1,82 +0,0 @@ -require "rubygems" - -require "log4r" - -module Vagrant - module Plugin - # Manages loading plugins from RubyGems. If a RubyGem has a `vagrant_init.rb` - # file somewhere on its load path, then this class will find it and load it. - # For logging purposes and debugging, the list of loaded plugins is - # stored in the {plugins} array. - class GemLoader - # The array of gem specifications that were loaded as plugins. - @@plugins = [] - - # Loads all the plugins for Vagrant. Plugins are currently - # gems which have a "vagrant_init.rb" somewhere on their - # load path. This file is loaded to kick off the load sequence - # for that plugin. - def self.load! - logger = Log4r::Logger.new("vagrant::plugin") - logger.info("Searching and loading any available plugins...") - - # Our version is used for checking dependencies - our_version = Gem::Version.create(Vagrant::VERSION) - - # RubyGems 1.8.0 deprecated `source_index`. Gem::Specification is the - # new replacement. For now, we support both, but special-case 1.8.x - # so that we avoid deprecation messages. - index = Gem::VERSION >= "1.8.0" ? Gem::Specification : Gem.source_index - - # Stupid hack since Rails 2.3.x overrides Gem.source_index with their - # own incomplete replacement which causes issues. - index = [index.installed_source_index, index.vendor_source_index] if defined?(Rails::VendorGemSourceIndex) && index.is_a?(Rails::VendorGemSourceIndex) - - # Look for a vagrant_init.rb in all the gems, but only the - # latest version of the gems. - [index].flatten.each do |source| - # In 1.6.0, added the option of including prerelease gems, which is - # useful for developers. - specs = Gem::VERSION >= "1.6.0" ? source.latest_specs(true) : source.latest_specs - - specs.each do |spec| - if @@plugins.include?(spec) - logger.debug("Plugin already loaded, not loading again: #{spec.name}") - next - end - - # If this gem depends on Vagrant, verify this is a valid release of - # Vagrant for this gem to load into. - vagrant_dep = spec.dependencies.find { |d| d.name == "vagrant" } - if vagrant_dep && !vagrant_dep.requirement.satisfied_by?(our_version) - logger.debug("Plugin Vagrant dependency mismatch: #{spec.name} (#{spec.version})") - next - end - - # Find a vagrant_init.rb to verify if this is a plugin - file = nil - if Gem::VERSION >= "1.8.0" - file = spec.matches_for_glob("**/vagrant_init.rb").first - else - file = Gem.searcher.matching_files(spec, "vagrant_init.rb").first - end - - next if !file - - logger.info("Loading plugin: #{spec.name} (#{spec.version})") - @@plugins << spec - load file - end - - logger.info("Loaded #{@@plugins.length} plugins.") - end - end - - # Returns the array of plugins which are currently loaded by - # Vagrant. - # - # @return [Array] - def self.plugins; @@plugins; end - end - end -end