diff --git a/lib/vagrant.rb b/lib/vagrant.rb index 63645f06a..778009f98 100644 --- a/lib/vagrant.rb +++ b/lib/vagrant.rb @@ -50,6 +50,9 @@ require 'i18n' # there are issues with ciphers not being properly loaded. require 'openssl' +# Always make the version available +require 'vagrant/version' + module Vagrant autoload :Action, 'vagrant/action' autoload :Box, 'vagrant/box' @@ -186,7 +189,3 @@ Vagrant.provisioners.register(:shell) { Vagrant::Provisioners::Shell } Vagrant.config_keys.register(:freebsd) { Vagrant::Guest::FreeBSD::FreeBSDConfig } Vagrant.config_keys.register(:linux) { Vagrant::Guest::Linux::LinuxConfig } Vagrant.config_keys.register(:solaris) { Vagrant::Guest::Solaris::SolarisConfig } - -# Load the things which must be loaded before anything else. -require 'vagrant/version' -Vagrant::Plugin.load! diff --git a/lib/vagrant/environment.rb b/lib/vagrant/environment.rb index fc6503951..d74adb69e 100644 --- a/lib/vagrant/environment.rb +++ b/lib/vagrant/environment.rb @@ -88,6 +88,9 @@ module Vagrant # Setup the default private key @default_private_key_path = @home_path.join("insecure_private_key") copy_insecure_private_key + + # Load the plugins + load_plugins end #--------------------------------------------------------------- @@ -494,5 +497,17 @@ module Vagrant nil end + + # Loads the Vagrant plugins by properly setting up RubyGems so that + # our private gem repository is on the path. + def load_plugins + # Add our private gem path to the gem path and reset the paths + # that Rubygems knows about. + ENV["GEM_PATH"] = "#{@gems_path}:#{ENV["GEM_PATH"]}" + ::Gem.clear_paths + + # Load the plugins + Plugin.load! + end end end diff --git a/lib/vagrant/plugin.rb b/lib/vagrant/plugin.rb index abdbccd73..62da439c2 100644 --- a/lib/vagrant/plugin.rb +++ b/lib/vagrant/plugin.rb @@ -9,15 +9,9 @@ module Vagrant # (for debugging), the list of loaded plugins is stored in the {plugins} # array. class Plugin - # The array of loaded plugins. + # The array of gem specifications that were loaded as plugins. @@plugins = [] - # The gemspec of this plugin. This is an actual gemspec object. - attr_reader :gemspec - - # The path to the `vagrant_init.rb` file which was loaded for this plugin. - attr_reader :file - # 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 @@ -46,6 +40,11 @@ module Vagrant 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" } @@ -65,7 +64,8 @@ module Vagrant next if !file logger.info("Loading plugin: #{spec.name} (#{spec.version})") - @@plugins << new(spec, file) + @@plugins << spec + load file end logger.info("Loaded #{@@plugins.length} plugins.") @@ -77,15 +77,5 @@ module Vagrant # # @return [Array] def self.plugins; @@plugins; end - - # Initializes a new plugin, given a Gemspec and the path to the - # gem's `vagrant_init.rb` file. This should never be called manually. - # Instead {load!} creates all the instances. - def initialize(spec, file) - @gemspec = spec - @file = file - - load file - end end end