Подтвердить что ты не робот

Спросите плагин бродяг в Vagrantfile?

Предполагаемое выполнение Vagrantfile требует наличия специального плагина Vagrant. Итак, в основном, что вам нужно сделать, это

$ vagrant plugin install foobar-plugin
$ vagrant up

Если вы пропустите первый шаг, vagrant up завершится с ошибкой.

Есть ли опция в Vagrant, чтобы она автоматически устанавливала плагин? Другими словами: можно ли указать внутри Vagrantfile, какие плагины устанавливать автоматически перед созданием и загрузкой машины?

4b9b3361

Ответ 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