2016-07-06 7 views
2

Ich versuche, neue benutzerdefinierte Option für Vagrant zu implementieren, wie in dem folgenden Vagrantfile:Wie implementiert benutzerdefinierte Option für Vagrant ohne ungültige Option Warnung?

# -*- mode: ruby -*- 
require 'getoptlong' 

opts = GetoptLong.new(
    [ '--vm-name',  GetoptLong::OPTIONAL_ARGUMENT ], 
) 

vm_name  = ENV['VM_NAME'] || 'default' 

begin 
    opts.each do |opt, arg| 
    case opt 
     when '--vm-name';  vm_name  = arg 
    end 
    end 
    rescue 
# @fixme: An invalid option error happens here. 
end 

Vagrant.configure(2) do |config| 
    config.vm.define vm_name 
    config.vm.provider "virtualbox" do |vbox, override| 
    override.vm.box = "ubuntu/wily64" 
    end 
end 

Nun, jedes Mal, wenn ich einen vagabundierenden Befehl ausführen es die folgende Warnung zeigt, z.B.

vagrant destroy -f 

/opt/vagrant/embedded/gems/gems/vagrant-1.8.1/bin/vagrant: ungültige Option - f

Ein weiteres Beispiel:

$ vagrant --vm-name=foo up --no-provision 
/opt/vagrant/embedded/gems/gems/vagrant-1.8.1/bin/vagrant: unrecognized option `--no-provision' 
Bringing machine 'foo' up with 'virtualbox' provider... 
==> foo: Importing base box 'ubuntu/wily64'... 

Gibt es eine Möglichkeit, dass ich eine solche Warnung im oben genannten Abschnitt rescue ignorieren kann?


Diese post ist ähnlich, aber es ist in diesem Fall nicht viel.

Antwort

5

Es ist unmöglich, dies in Vagrantfile zu tun. Vagrant analysiert Optionen vor dem Laden Vagrantfile. Der Moment Vagrantfile wird ausgeführt, Vagrant-Prozess befindet sich bereits in dem ensure-Block nach der Ausnahme, die wegen der benutzerdefinierten Option in der Befehlszeile auftrat. Es gibt nichts, was man in Vagrantfile tun kann, um sich davon zu erholen.

+0

Ich denke, es ist möglich, für den oben gezeigten Anwendungsfall - siehe meine Antwort unten. –

2

Ich denke, es ist möglich, den Fehler zu vermeiden. Warnung - Ich bin neu in Landstreicher. Dies scheint jedoch zu tun, was Sie suchen:

opts = GetoptLong.new(
    [ '--vm-name',  GetoptLong::OPTIONAL_ARGUMENT ], 
    [ '--host-name',  GetoptLong::OPTIONAL_ARGUMENT ], 
    [ '--provider',  GetoptLong::OPTIONAL_ARGUMENT ], 
    [ '--no-provision', GetoptLong::OPTIONAL_ARGUMENT ], 
) 
vm_name  = ENV['VM_NAME'] || 'default' 
host_name  = ENV['HOST_NAME'] || 'localhost.localdomain' 

Wenn Sie alle Befehlszeilenoptionen antizipieren können Sie denken an Ihre vagrant Aufruf übergeben werden, können Sie sie mit dem getopts Array hinzufügen und dann einfach ignorieren die Elemente, die standardmäßig verarbeitet werden sollen.

+0

ein bisschen wie ein Hack, aber das funktioniert;) – 4c74356b41

Verwandte Themen