Aktualizacja 2019: Vagrant ma teraz funkcjonalność wymagającą wtyczek poprzez Vagrantfile
via:
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
Jeśli Vagrant wykryje, że istnieją wtyczki, które nie są jeszcze zainstalowane, poprosi użytkownika o ich samodzielną instalację:
$ 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.
Zobacz https://www.vagrantup.com/docs/vagrantfile/vagrant_settings.html
AKTUALIZACJA 31 sierpnia 2018: Zobacz poprawkę @ Starx poniżej dla nowszych wersji Vagrant (1.8 i nowsze)
Oto wersja oparta na rozwiązaniu Louisa St.Amoura wraz z komentarzem Roba Kinyona o ponownym wykonaniu, jeśli zainstalowano nową wtyczkę, z powodzeniem używam jej w mojej własnej konfiguracji:
źródło
git clone...; cd ...; vagrant up
pierwszego użycia ).Ponieważ jestem programistą Ruby, a Bindler nie jest już obsługiwany, wydaje mi się najbardziej naturalne, aby po prostu napisać kod na górze mojego pliku Vagrantfile, aby zainstalować wymagane wtyczki, jeśli ich brakuje (np. Przed
Vagrant.configure
linią)U mnie działa:
required_plugins = %w( vagrant-hostmanager vagrant-someotherplugin ) required_plugins.each do |plugin| system "vagrant plugin install #{plugin}" unless Vagrant.has_plugin? plugin end
system
, w przeciwieństwie do używania lewych apostrofów, spowoduje wyświetlenie polecenia na stdout, tak jak samo wykonanie polecenia. I w ten sposób nie potrzebuję kolejnej dziwnie nazwanej wtyczki lub systemu do śledzenia wymaganych wtyczek, które i tak mogą być aktualizowane przez Vagrant.źródło
Vagrant.has_plugin?
polecenie na poziomie powłoki lub po prostuvagrant plugin install
sprawdzić, czy wtyczka już tam jest.if [ $(vagrant plugin list | egrep 'vagrant-hostsupdater|vagrant-share' -c) == 2 ] ; then echo "All plugins installed." ; else echo "Missing plugin"; fi
ale jest powód, dla którego nikt nie pisze skryptów basha, jeśli mogą temu pomóc ;-) Może poeksperymentować z poleceniem wtyczki włóczęgi?Jak wskazałem w odpowiedzi na Twoje drugie pytanie , możesz użyć bindlera do zainstalowania zestawu wtyczek specyficznych dla projektu za pomocą jednego polecenia.
Jeśli program bindler jest zainstalowany, a wymagana wtyczka nie jest, program bindler wyświetli błąd i przerwie proces. Istnieje również otwarty problem związany z automatyczną instalacją wtyczek na
vagrant up
s, ale jak dotąd nikt się do tego nie zapisał.Jeśli nie chcesz używać bindlera, możesz skorzystać z
Vagrant.has_plugin?
(dostępne w wersji 1.3.0+) u góry swojegoVagrantfile
i wyświetlić błąd, jeśli wymagana wtyczka nie jest zainstalowana.Coś jak:
AKTUALIZACJA : Bindler nie jest już obsługiwany i od 11 maja 2015 r. Rdzeń Vagrant nie zapewnia żadnej równoważnej funkcjonalności
źródło
Gemfile
pod:plugins
grupę Vagrant sprawdzi. Zobacz moją odpowiedź poniżej, aby uzyskać więcej informacji.Gemfile
jest przeznaczony do tworzenia wtyczek Vagrant. Zobacz github.com/mitchellh/vagrant/issues/8370Należy pamiętać, że od wersji Vagrant 1.5 możesz określić swoje zależności w pliku
Gemfile
. Zgodnie z wpisem na blogu dotyczącym aktualizacji :źródło
Gemfile
, czy mógłbyś wyjaśnić, jak to ustawiłeś? Utworzyłem podobny do twojego przykładu, alevagrant up
niczego nie ładuje automatycznie. Próbowałem,bundle install
ale to daje pytanie o uprawnienia systemowe Rubygems, co nie brzmi dobrze.Nie mogłem dodać komentarza do odpowiedzi Louisa St-Amoura, ale chciałem to opublikować na wypadek, gdyby ktoś potrzebował pomocy w rozszerzeniu jego rozwiązania.
źródło
vagrant-list
powyżej jest przykład wtyczki, a nie niezbędna część kodu. Możesz zobaczyć inne wtyczki Vagrant tutaj: vagrant-lists.github.ioW nowej wersji Vagrant odpowiedź autorstwa @Amos Shapira utknęła w nieskończonej pętli. Powodem tego jest to, że każde wywołanie
vagrant plugin install
również przetwarzaVagrantfile
i po przetworzeniu wykonuje kod związany z instalacją wtyczki raz po raz i tak dalej.Oto moje rozwiązanie, które pozwala uniknąć pętli.
# 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
źródło
Właśnie zauważyłem tutaj http://docs.vagrantup.com/v2/plugins/packaging.html instrukcję
który robi dokładnie to samo, co opisał fgrehm: szybko zgłasza błąd, jeśli wtyczka nie jest zainstalowana.
O ile wiem, nadal nie ma możliwości automatycznej instalacji wtyczek
źródło
Vagrant.require_plugin
jest przestarzałe. Sprawdzone z Vagrantem1.7.4
.Moja odpowiedź jest bardzo zbliżona do odpowiedzi Louisa St-Amour , ale zamiast automatycznie instalować wtyczki, po prostu generuje komunikat o błędzie, więc użytkownik musi zainstalować wtyczkę ręcznie.
Wolałbym, aby użytkownicy byli świadomi wszelkich zainstalowanych wtyczek, ponieważ mają one zastosowanie globalnie do wszystkich instancji Vagrant, a nie tylko do bieżącego pliku Vagrantfile.
Umieść na górze
Vagrantfile
jednej linii, tak jak to, dla każdej wtyczki, w tym przykładzievagrant-vbguest
:źródło
Możesz skorzystać z tego projektu (jestem autorem): https://github.com/DevNIX/Vagrant-dependency-manager
Opiera się na podobnych odpowiedziach, ale stara się być bardziej kompletny i stabilny. Dużą zaletą tego pomysłu jest to, że możesz rozpowszechniać swój plik Vagrantfile i będzie on działał na każdym komputerze niezależnie od zainstalowanych wtyczek w tym środowisku.
Jest łatwy w użyciu:
Uwzględnij go i wywołaj
check_plugins
przekazywanie zależności jako tablicyPrzykład:
???
Zysk!
Bardzo chciałbym scalić żądania ściągnięcia, rozwiązać każdy problem i uzyskać pomysły na nowe funkcje. Obecnie myślę o aktualizacji samego menedżera zależności i wymaganiu konkretnych wersji wtyczek: D
Pozdrowienia!
źródło
Mam problem z nową instalacją Vagranta, gdzie katalog .vagrant.d nie jest jeszcze utworzony. Udało mi się sprawić, że fragment z Luisa St. Amour działał, wychwytując wyjątek.
źródło
up
jest uruchamiany przezup
. Czy można tego uniknąć bezvagrant up
dwukrotnego uruchamiania ?Oto, czego używam w Vagrant 1.8 i działa dobrze. Umieść to gdzieś przed blokiem konfiguracji w swoim pliku Vagrantfile.
źródło