Спросите плагин бродяг в Vagrantfile?
Предполагаемое выполнение Vagrantfile
требует наличия специального плагина Vagrant. Итак, в основном, что вам нужно сделать, это
$ vagrant plugin install foobar-plugin
$ vagrant up
Если вы пропустите первый шаг, vagrant up
завершится с ошибкой.
Есть ли опция в Vagrant, чтобы она автоматически устанавливала плагин? Другими словами: можно ли указать внутри Vagrantfile
, какие плагины устанавливать автоматически перед созданием и загрузкой машины?
Ответы
Ответ 1
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
Ответ 2
ОБНОВЛЕНИЕ 31 августа 2018: см. Исправление @Starx ниже для более поздних версий Vagrant (1.8 и выше)
Вот версия, основанная на решении Louis St. Amour вместе с комментарием Роба Киньона о повторном запуске, если новый плагин был установлен, я успешно использую его в моей собственной установке:
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
Ответ 3
Поскольку я являюсь разработчиком Ruby, и Bindler больше не поддерживается, я считаю наиболее естественным просто написать код вверху моего Vagrantfile для установки необходимых плагинов, если он отсутствует (например, до строки 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
, в отличие от использования backticks, будет эхо-команда на stdout, так же как и выполнение команды самостоятельно. И таким образом мне не нужен еще один странно названный плагин или система, чтобы отслеживать необходимые плагины, которые в любом случае могут быть обновлены Vagrant.
Ответ 4
Как я уже говорил в ответе на другой ваш вопрос, вы можете использовать bindler для установки набора плагинов, специфичных для проекта, с помощью одной команды.
Если bindler установлен, а требуемый плагин - нет, bindler выдаст ошибку и прервет процесс. Существует также открытая проблема, связанная с автоматической установкой плагинов на vagrant up
но пока никто не подписался на нее.
Если вы не хотите использовать bindler, вы можете использовать Vagrant.has_plugin?
(доступно на 1.3. 0+) вверху вашего Vagrantfile
и 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 больше не поддерживается и эквивалентная функциональность не была предоставлена ядром Vagrant с 11 мая 2015 г.
Ответ 5
Обратите внимание, что Gemfile
с Vagrant 1.5 вы можете указать свои зависимости в своем Gemfile
. Согласно сообщению в блоге об обновлении:
Теперь Vagrant 1.5 автоматически загрузит все драгоценные камни в группу "plugins" в вашем Gemfile. Например, вот Gemfile для плагина "vagrant-bar":
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
Ответ 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
Ответ 7
В новой версии Vagrant ответ @Amos Shapira застрял в бесконечном цикле. Причина этого заключается в том, что каждый вызов vagrant plugin install
Vagrantfile
vagrant plugin install
также обрабатывает Vagrantfile
а при обработке выполняет код, связанный с установкой плагина снова и снова, и так далее.
Вот мое решение, которое избегает циклы.
# Plugins
#
# Check if the first argument to the vagrant
# command is plugin or not to avoid the loop
if ARGV[0] != 'plugin'
# Define the plugins in an array format
required_plugins = [
'vagrant-vbguest', 'vagrant-hostmanager',
'vagrant-disksize'
]
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
end
Ответ 8
Я только что заметил здесь http://docs.vagrantup.com/v2/plugins/packaging.html инструкцию
Vagrant.require_plugin "vagrant-aws"
который делает то же самое, что и desgibed fgrehm: быстро поднимает ошибку, если плагин не установлен.
Насколько я знаю, нет возможности автоматически устанавливать плагины
Ответ 9
Мой ответ очень близок к Louis St-Amour answer, но вместо автоматической установки плагинов он просто вызывает сообщение об ошибке, так что пользователь должен установить плагин вручную.
Я бы предпочел, чтобы пользователи знали о любых плагинах, которые устанавливаются, потому что они применяются глобально ко всем экземплярам Vagrant, а не только к текущему Vagrantfile.
Поместите вверху Vagrantfile
одну строку, подобную этой для каждого плагина, в этом примере vagrant-vbguest
:
raise "vagrant-vbguest plugin must be installed" unless Vagrant.has_plugin? "vagrant-vbguest"
Ответ 10
Вы можете использовать этот проект (я автор): https://github.com/DevNIX/Vagrant-dependency-manager
Он основан на похожих ответах, но пытается быть более полным и стабильным. Большим преимуществом этой идеи является то, что вы можете распространять свой Vagrantfile и запускаться на каждом компьютере независимо от установленных плагинов в этой среде.
Легко использовать:
- Скопируйте параметр dependency_manager.rb рядом с вашим Vagrantfile
-
Включите его и вызовите 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
-
???
-
Profit!
Я хотел бы объединить запросы на тяну, исправить любую проблему, которую мог бы иметь, и получить идеи о новых функциях. В настоящее время я думаю об обновлении самого менеджера зависимостей и требующих конкретных версий плагина: D
Привет!
Ответ 11
У меня возникла проблема с новой установкой Vagrant, где каталог .vagrant.d еще не создан. Я смог сделать снипп из работы Луиса Сент-Амура, поймав исключение.
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
Ответ 12
Здесь я использую Vagrant 1.8, и он работает нормально. Поместите это где-то перед блоком configure в свой 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