在Vagrant文件中需要一个Vagrant插件吗?

在Vagrant文件中需要一个Vagrant插件吗?,vagrant,Vagrant,假设执行Vagrant文件需要安装特定的Vagrant插件。所以,基本上你需要做的是 $ vagrant plugin install foobar-plugin $ vagrant up 如果跳过第一步,vagrant up将失败 Vagrant中有没有一个选项可以让它自动安装插件?换句话说:在创建和启动机器之前,是否可以在vagrant文件中指定要自动安装的插件?正如我所说,您可以使用一个命令来安装特定于项目的一组插件 如果安装了bindler而所需插件未安装,bindler将出错并中止该

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

$ vagrant plugin install foobar-plugin
$ vagrant up
如果跳过第一步,
vagrant up
将失败

Vagrant中有没有一个选项可以让它自动安装插件?换句话说:在创建和启动机器之前,是否可以在
vagrant文件中指定要自动安装的插件?

正如我所说,您可以使用一个命令来安装特定于项目的一组插件

如果安装了bindler而所需插件未安装,bindler将出错并中止该过程。还有一个与自动在vagrant up上安装插件相关的问题,但到目前为止还没有人注册

如果您不想使用bindler,可以使用
Vagrant.has_plugin?
(可在1.3.0+上获得)位于
Vagrant文件顶部的
Vagrant,如果未安装所需的插件,则会出错

比如:

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

更新:截至2015年5月11日,Vagrant core不再支持Bindler,也没有提供等效的功能

我刚刚注意到这里有一条说明

Vagrant.require_plugin "vagrant-aws"
这与fgrehm描述的完全相同:如果插件未安装,则快速引发错误


据我所知,仍然没有办法自动安装插件,因为我是一名Ruby开发人员,Bindler不再被维护,我发现最自然的做法是在Vagrant文件的顶部编写一些代码,以便在缺少插件时安装所需插件(例如,在
Vagrant.configure
line之前)

以下是我的作品:

必需的插件=%w(vagrant hostmanager vagrant someotherplugin)
必需的插件。每个do插件|
系统“vagrant plugin install#{plugin}”,除非vagrant.has_plugin?插件
结束

系统
与使用反勾号不同,它会将命令回显到stdout,就像自己运行命令一样。这样,我就不需要另外一个名字奇怪的插件或系统来跟踪所需的插件,这些插件无论如何都可以由Vagrant更新。

请注意,从Vagrant 1.5开始,您可以在
文件中指定依赖项。根据:

现在,Vagrant 1.5将自动加载“插件”中的任何gem 组在您的文件中。例如,下面是一个 “流浪酒吧”插件:


2018年8月31日更新:有关Vagrant(1.8及以上)的更高版本,请参见

以下是基于Louis St.Amour解决方案的版本,以及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

无法对Louis St Amour的回答添加评论,但我想发布这篇文章,以防有人需要帮助扩展他的解决方案

# 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

我的答案非常接近,但它不是自动安装插件,而是引发一条错误消息,因此用户必须手动安装插件

我希望用户知道安装的任何插件,因为它们全局应用于所有Vagrant实例,而不仅仅是当前的Vagrant文件

# 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
对于每个插件,在
Vagrantfile
的顶部像这样放置一行,在本例中,
vagrantvbguest

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

我在新安装Vagrant时遇到问题,其中.Vagrant.d目录尚未创建。通过捕捉异常,我能够使路易斯·圣·阿穆尔(Luis St.Amour)的片段发挥作用

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上使用的,它工作正常。将其放在文件中configure块之前的某个位置

# 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

您可以使用此项目(我是作者):

它基于相似的答案,但试图更完整、更稳定。这个想法的最大优点是,您可以分发您的Vagrant文件,它将在每台计算机上运行,而不考虑该环境中安装的插件

它易于使用:

  • 复制文件旁边的dependency_manager.rb
  • 包括它并调用
    检查插件
    将依赖项作为数组传递

    例如:

    # -*- 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
    
  • 利润

  • 我很想合并拉请求,修复您可能遇到的任何问题,并获得新功能的想法。目前我正在考虑更新依赖关系管理器本身,并需要特定的插件版本:D


    问候

    在新版《流浪汉》中,@Amos Shapira的回答陷入了无限循环。原因是每次调用
    vagrant plugin install
    都会处理
    vagrant文件
    ,处理后会反复执行与安装插件相关的代码,以此类推

    这是我的解决方案,它避免了循环

    #插件
    #
    #检查第一个参数是否与流浪汉有关
    #命令是否为插件,以避免循环
    如果ARGV[0]!='插件'
    #以数组格式定义插件
    必需的插件=[
    “流浪客”,“流浪旅店经理”,
    “浮动磁盘大小”
    ]         
    plugins_to_install=必需的_plugins.select{| plugin | not Vagrant.has_plugin?plugin}
    如果没有插件,请安装为空?
    将“安装插件:{plugins_to_install.join(“”)}”
    如果系统“vagrant plugin install#{plugins_to_install.join(“”)}”
    执行“流浪者”{ARGV.join(“”)}
    其他的
    “中止”一个或多个插件的安装失败。正在中止
    结束
    结束
    结束
    
    2019更新:Vagrant现在具有通过
    Vagrant文件
    通过以下方式要求插件的功能:

    Vagrant.configure(“2”)do | config|
    config.vagrant.plugins=“vagrant some plugin”
    #或作为数组:
    config.vagrant.plugins=[“vagrant some plugin”,“vagrant some other plugin”]
    #或者作为散列
    config.vagrant.plugins={“vagrant some plugin”=>{“version”=>“1.0.0”}
    结束
    
    如果Vagrant检测到有尚未安装的插件,它将
    $ vagrant up
    Vagrant has detected project local plugins configured for this
    project which are not installed.
    
      vagrant-some-plugin
    Install local plugins (Y/N) [N]: y
    Installing the 'vagrant-some-plugin' plugin. This can take a few minutes...
    Fetching vagrant-some-plugin-1.0.0.gem
    Installed the plugin 'vagrant-some-plugin (1.0.0)'!
    
    
    Vagrant has completed installing local plugins for the current Vagrant
    project directory. Please run the requested command again.