假设执行Vagrantfile
需要安装特定的Vagrant插件。所以,基本上你需要做的是
$ vagrant plugin install foobar-plugin
$ vagrant up
如果您跳过第一步,vagrant up
将失败。
Vagrant中是否有选项让它自动安装插件?换句话说:是否可以在Vagrantfile
内指定在创建和启动计算机之前自动安装哪些插件?
答案 0 :(得分:67)
更新2018年8月31日:有关Vagrant的更高版本(1.8及更高版本),请参阅下面的@ Starx修正
这是基于Louis St. Amour解决方案的版本以及Rob Kinyon关于重新执行的评论,如果安装了新的插件,我在我自己的设置中成功使用它:
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
答案 1 :(得分:50)
由于我是一个Ruby开发人员,并且Bindler不再被维护,我发现在我的Vagrant文件顶部编写一些代码以便在缺少时安装所需的插件是最自然的(例如在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
,与使用反引号不同,会将命令回显到stdout,就像自己运行命令一样。这样我就不需要另一个奇怪命名的插件或系统来跟踪所需的插件,无论如何都可以通过Vagrant进行更新。
答案 2 :(得分:48)
在我pointed out on my answer to your other question时,您可以使用bindler使用单个命令安装一组特定于项目的插件。
如果安装了bindler并且没有安装所需的插件,bindler将会出错并将中止该进程。还有an open issue与在vagrant up
上自动安装插件相关,但到目前为止还没有人注册过它。
如果您不想使用bindler,可以使用Vagrant.has_plugin?
顶部的Vagrantfile
(可在1.3.0+上找到),如果所需的插件不是,则会出错安装。
类似的东西:
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核心未提供相应的功能
答案 3 :(得分:11)
2019更新:Vagrant现在具有通过Vagrantfile
通过以下方式要求插件的功能:
Vagrant.configure("2") do |config|
config.vagrant.plugins = "vagrant-some-plugin"
# or as array:
config.vagrant.plugins = ["vagrant-some-plugin", "vagrant-some-other-plugin"]
# or as hash
config.vagrant.plugins = {"vagrant-some-plugin" => {"version" => "1.0.0"}}
end
请参见https://www.vagrantup.com/docs/vagrantfile/vagrant_settings.html
答案 4 :(得分:10)
请注意,从Vagrant 1.5开始,您可以在Gemfile
中指定依赖项。根据{{3}}:
现在,Vagrant 1.5会自动加载"插件中的任何宝石。 您的Gemfile中的组。举个例子,这里是一个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
答案 5 :(得分:6)
无法为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
答案 6 :(得分:3)
在新版本的Vagrant上,@ Amos Shapira的回答陷入了无限循环。这样做的原因是,每次对select name from Products where id = ?
的调用也会处理vagrant plugin install
,并在处理后执行与一次又一次地安装插件有关的代码。
这是我避免循环的解决方案。
Vagrantfile
答案 7 :(得分:1)
我在这里注意到http://docs.vagrantup.com/v2/plugins/packaging.html一条指令
Vagrant.require_plugin "vagrant-aws"
与fgrehm的描述完全相同:如果未安装插件,则会快速引发错误。
据我所知,暂时无法自动安装插件
答案 8 :(得分:1)
我的答案非常接近Louis St-Amour's answer,但不是自动安装插件,而是提出错误消息,以便用户必须手动安装插件。
我希望用户知道任何已安装的插件,因为它们全局应用于所有Vagrant实例,而不仅仅是当前的Vagrant文件。
将Vagrantfile
这样的一行放在每个插件的顶部,在此示例中为vagrant-vbguest
:
raise "vagrant-vbguest plugin must be installed" unless Vagrant.has_plugin? "vagrant-vbguest"
答案 9 :(得分:1)
您可以使用此项目(我是作者):https://github.com/DevNIX/Vagrant-dependency-manager
它基于类似的答案,但试图更完整和稳定。这个想法的最大优点是,您可以分发您的Vagrant文件,它将在每台计算机上运行,无论该环境中安装的插件是什么。
易于使用:
包含它并调用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
???
利润!
我很想合并拉取请求,解决您可能遇到的任何问题,并获得新功能的想法。目前我正在考虑更新依赖管理器本身,并需要特定的插件版本:D
问候!
答案 10 :(得分:0)
我遇到了新安装的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
答案 11 :(得分:0)
这是我在Vagrant 1.8上使用的,它运行正常。把它放在Vagrantfile中配置块之前的某个地方。
# 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