Actualización de 2019: Vagrant ahora tiene la funcionalidad para requerir complementos a través de la Vagrantfile
vía:
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"}}
end
Si Vagrant detecta que hay complementos que aún no están instalados, le pedirá al usuario que los instale él mismo:
$ 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.
Ver https://www.vagrantup.com/docs/vagrantfile/vagrant_settings.html
ACTUALIZACIÓN 31 de agosto de 2018: consulte la corrección de @ Starx a continuación para versiones posteriores de Vagrant (1.8 y superior)
Aquí hay una versión basada en la solución de Louis St. Amour junto con el comentario de Rob Kinyon sobre re-exec si se instaló un nuevo complemento, lo uso con éxito en mi propia configuración:
fuente
git clone...; cd ...; vagrant up
primera vez).Como soy un desarrollador de Ruby y Bindler ya no se mantiene, me pareció más natural escribir un poco de código en la parte superior de mi Vagrantfile para instalar los complementos necesarios si faltan (por ejemplo, antes de la
Vagrant.configure
línea)Lo siguiente funciona para mí:
required_plugins = %w( vagrant-hostmanager vagrant-someotherplugin ) required_plugins.each do |plugin| system "vagrant plugin install #{plugin}" unless Vagrant.has_plugin? plugin end
system
, a diferencia del uso de comillas invertidas, hará eco del comando en stdout, tal como lo haría al ejecutar el comando usted mismo. Y de esta manera, no necesito otro complemento o sistema con un nombre extraño para realizar un seguimiento de los complementos necesarios que Vagrant puede actualizar de todos modos.fuente
Vagrant.has_plugin?
comando en el nivel de shell o simplementevagrant plugin install
verificar si el complemento ya está allí.if [ $(vagrant plugin list | egrep 'vagrant-hostsupdater|vagrant-share' -c) == 2 ] ; then echo "All plugins installed." ; else echo "Missing plugin"; fi
pero hay una razón por la que nadie escribe scripts bash si pueden evitarlo ;-) ¿Quizás experimentar más con el comando del plugin vagabundo?Como señalé en mi respuesta a su otra pregunta , puede usar bindler para instalar un conjunto de complementos específicos para un proyecto usando un solo comando.
Si Bindler está instalado y el complemento requerido no lo está, Bindler generará un error y abortará el proceso. También hay un problema abierto relacionado con la instalación automática de complementos en
vagrant up
s, pero hasta ahora nadie se ha registrado todavía.Si no desea utilizar Bindler, puede utilizar
Vagrant.has_plugin?
(disponible en 1.3.0+) en la parte superior de suVagrantfile
y error si el complemento requerido no está instalado.Algo como:
ACTUALIZACIÓN : Bindler ya no es compatible y el núcleo de Vagrant no ha proporcionado ninguna funcionalidad equivalente a partir del 11 de mayo de 2015
fuente
Gemfile
un:plugins
grupo que Vagrant comprobará. Vea mi respuesta a continuación para obtener más detalles.Gemfile
está destinado al desarrollo de complementos de Vagrant. Ver github.com/mitchellh/vagrant/issues/8370Tenga en cuenta que a partir de Vagrant 1.5, puede especificar sus dependencias en su
Gemfile
. Según la publicación del blog sobre la actualización :fuente
Gemfile
, ¿te importaría explicar cómo lo configuraste? Creé uno similar a su ejemplo, perovagrant up
no carga nada automáticamente. Intenté,bundle install
pero eso está dando un mensaje sobre los permisos de Rubygems del sistema, que no suena bien.No pude agregar un comentario a la respuesta de Louis St-Amour, pero quería publicar esto en caso de que alguien necesitara ayuda para extender su solución.
fuente
vagrant-list
en cuenta que en lo anterior hay un ejemplo de un complemento, no una parte necesaria del código. Puede ver otros complementos de Vagrant aquí: vagrant-lists.github.ioEn la nueva versión de Vagrant, la respuesta de @Amos Shapira se atasca en un bucle infinito. La razón de esto es que cada llamada a
vagrant plugin install
también procesa elVagrantfile
y cuando se procesa ejecuta el código relacionado con la instalación del complemento una y otra vez y así sucesivamente.Aquí está mi solución que evita el bucle.
# 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
fuente
Acabo de notar aquí http://docs.vagrantup.com/v2/plugins/packaging.html una instrucción
que hace exactamente lo mismo que lo que describió fgrehm: generar rápidamente un error si el complemento no está instalado.
Hasta donde yo sé, todavía no hay forma de instalar complementos automáticamente
fuente
Vagrant.require_plugin
es obsoleto. Comprobado con Vagrant1.7.4
.Mi respuesta está muy cerca de la respuesta de Louis St-Amour , pero en lugar de instalar complementos automáticamente, solo genera un mensaje de error, por lo que el usuario tiene que instalar el complemento manualmente.
Preferiría que los usuarios estén al tanto de los complementos que se instalan, porque se aplican globalmente a todas las instancias de Vagrant, no solo al Vagrantfile actual.
Coloque en la parte superior de
Vagrantfile
una línea como esta para cada complemento, en este ejemplovagrant-vbguest
,:fuente
Podrías usar este proyecto (soy el autor): https://github.com/DevNIX/Vagrant-dependency-manager
Se basa en respuestas similares pero tratando de ser más completo y estable. La gran ventaja de esta idea es que puede distribuir su Vagrantfile y se ejecutará en todas las computadoras independientemente de los complementos instalados en ese entorno.
Es fácil de usar:
Inclúyalo y llame
check_plugins
pasando sus dependencias como una matrizEjemplo:
???
¡Lucro!
Me encantaría fusionar solicitudes de extracción, solucionar cualquier problema que pudiera tener y obtener ideas de nuevas funciones. Actualmente estoy pensando en actualizar el administrador de dependencias en sí mismo y requerir versiones de complementos específicas: D
¡Saludos!
fuente
Tengo un problema con la nueva instalación de Vagrant, donde aún no se ha creado el directorio .vagrant.d. Pude hacer que el fragmento de Luis St. Amour funcionara al detectar la excepción.
fuente
up
lo está ejecutandoup
. ¿Hay alguna forma de evitar esto sin ejecutarvagrant up
dos veces?Esto es lo que estoy usando en Vagrant 1.8 y funciona bien. Pon esto en algún lugar antes del bloque de configuración en tu Vagrantfile.
fuente