在Vagrantfile中需要一个Vagrant插件?

假设执行Vagrantfile需要安装特定的Vagrant插件。 所以,基本上你需要做的是

 $ vagrant plugin install foobar-plugin $ vagrant up 

如果你跳过第一步, vagrant up失败了。

Vagrant中有一个选项可以自动安装插件吗? 换句话说:在创build和引导机器之前,是否可以在Vagrantfile中指定要自动安装的插件?

正如我在回答您的其他问题时所指出的那样 ,您可以使用bindler来使用单个命令来安装特定于项目的一组插件。

如果安装了绑定程序,并且所需的插件不是,则绑定程序将错误并中止该过程。 还有一个开放的问题涉及自动安装插件在vagrant up但到目前为止还没有人注册。

如果你不想使用绑定器,你可以使用Vagrant.has_plugin? (可用于1.3.0以上)在您的Vagrantfile的顶部,如果没有安装所需的插件,则会出错。

就像是:

 unless Vagrant.has_plugin?("vagrant-some-plugin") raise 'some-plugin is not installed!' end Vagrant.configure("2") do |config| config.vm.box = "box-name" end 

更新 :Bindler不再支持,2015年5月11日Vagrant核心没有提供相同的function

这里是基于Louis St. Amour的解决scheme和Rob Kinyon关于re-exec的评论(如果安装了一个新插件)的版本,我在我自己的设置中成功使用它:

 required_plugins = %w(vagrant-share vagrant-vbguest...) plugins_to_install = required_plugins.select { |plugin| not Vagrant.has_plugin? plugin } if not plugins_to_install.empty? puts "Installing plugins: #{plugins_to_install.join(' ')}" if system "vagrant plugin install #{plugins_to_install.join(' ')}" exec "vagrant #{ARGV.join(' ')}" else abort "Installation of one or more plugins has failed. Aborting." end end 

由于我是Ruby开发人员,而且Bindler不再被维护,所以我发现在我的Vagrant文​​件的顶部写一些代码来安装所需的插件(如果在Vagrant.configure行之前)是最自然的Vagrant.configure

以下为我工作:

 required_plugins = %w( vagrant-hostmanager vagrant-someotherplugin ) required_plugins.each do |plugin| system "vagrant plugin install #{plugin}" unless Vagrant.has_plugin? plugin end 

system ,不像使用反引号,将命令回显标准输出,就像自己运行命令一样。 这样我就不需要另一个奇怪的插件或系统来跟踪所需的插件,无论如何都可以通过Vagrant进行更新。

请注意,从Vagrant 1.5开始,您可以在您的Gemfile指定您的依赖关系。 根据更新的博客文章 :

现在,Vagrant 1.5会自动加载您的Gemfile中的“插件”组中的任何gem。 举个例子,这里是一个“vagrant-bar”插件的Gemfile:

 source "https://rubygems.org" group :development do gem "vagrant", git: "https://github.com/mitchellh/vagrant.git" end group :plugins do gem "vagrant-foo", gem "vagrant-bar", path: "." end 

无法为Louis St-Amour的答案添加评论,但我想发布这个以防万一任何人需要帮助扩展他的解决scheme。

 # Check for missing plugins required_plugins = %w(vagrant-list) plugin_installed = false required_plugins.each do |plugin| unless Vagrant.has_plugin?(plugin) system "vagrant plugin install #{plugin}" plugin_installed = true end end # If new plugins installed, restart Vagrant process if plugin_installed === true exec "vagrant #{ARGV.join' '}" end 

我只是在这里注意到http://docs.vagrantup.com/v2/plugins/packaging.html一个指令;

 Vagrant.require_plugin "vagrant-aws" 

与fgrehm所描述的完全一样:如果没有安装插件,则会很快产生一个错误。

据我所知,有没有办法自动安装插件

我的答案与Louis St-Amour的答案非常接近,但不是自动安装插件,而是提出一个错误消息,以便用户必须手动安装插件。

我宁愿用户意识到任何已安装的插件,因为它们全局应用于所有的stream浪实例,而不仅仅是当前的stream浪文件。

在这个例子中,在每个插件的Vagrantfile的顶部Vagrantfile一行, vagrant-vbguest

  raise "vagrant-vbguest plugin must be installed" unless Vagrant.has_plugin? "vagrant-vbguest" 

你可以使用这个项目(我是作者): https : //github.com/DevNIX/Vagrant-dependency-manager

这是基于类似的答案,但试图更加完整和稳定。 这个想法的一大优点是,您可以分发您的Vagrant文​​件,并且无论在该环境中安装了哪些插件,它都可以在每台计算机上运行。

它很容易使用:

  1. 复制Vagrantfile旁边的dependency_manager.rb
  2. 包括它并调用check_plugins作为一个数组传递你的依赖关系

    例:

     # -*- mode: ruby -*- # vi: set ft=ruby : require File.dirname(__FILE__)+"./dependency_manager" check_plugins ["vagrant-exec", "vagrant-hostsupdater", "vagrant-cachier", "vagrant-triggers"] Vagrant.configure(2) do |config| config.vm.box = "base" end 
  3. ???

  4. 利润!

我很乐意合并pull请求,解决你可能遇到的任何问题,并获得新function的想法。 目前我正在考虑更新依赖pipe理器本身,并要求特定的插件版本:D

问候!

我遇到了一个新的安装Vagrant的问题,那里的.vagrant.d目录还没有创build。 我能够从路易斯·圣·阿慕尔(Luis St. Amour)的片段中找出exception。

 required_plugins = %w(vagrant-share vagrant-vbguest) begin plugins_to_install = required_plugins.select { |plugin| not Vagrant.has_plugin? plugin } if not plugins_to_install.empty? puts "Installing plugins: #{plugins_to_install.join(' ')}" if system "vagrant plugin install #{plugins_to_install.join(' ')}" exec "vagrant #{ARGV.join(' ')}" else abort "Installation of one or more plugins has failed. Aborting." end end rescue exec "vagrant #{ARGV.join(' ')}" end 

这是我使用的Vagrant 1.8,它工作正常。 把它放在你的Vagrantfile的configuration块之前。

 # install required plugins if necessary if ARGV[0] == 'up' # add required plugins here required_plugins = %w( plugin1 plugin2 plugin3 ) missing_plugins = [] required_plugins.each do |plugin| missing_plugins.push(plugin) unless Vagrant.has_plugin? plugin end if ! missing_plugins.empty? install_these = missing_plugins.join(' ') puts "Found missing plugins: #{install_these}. Installing using sudo..." exec "sudo vagrant plugin install #{install_these}; vagrant up" end end