2016-07-06 21 views
2

我試圖實現對流浪新的自定義選項,如下Vagrantfile如何在沒有無效選項警告的情況下爲Vagrant實現自定義選項?

# -*- 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 

現在,每次當我運行任何流浪漢命令它顯示下面的警告,例如

vagrant destroy -f 

/opt/vagrant/embedded/gems/gems/vagrant-1.8.1/bin/vagrant:無效選項 - ˚F

又如:

$ 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'... 

有沒有什麼辦法可以忽略上述rescue節中發生的這種警告?


這個post是類似的,但它在這種情況下沒有多大幫助。

回答

5

這是不可能的,在Vagrantfile。在加載Vagrantfile之前,Vagrant解析選項。執行Vagrantfile時,在由於命令行中的自定義選項而發生異常之後,流程進程已位於ensure塊中。 Vagrantfile無法從中恢復。

+0

我認爲這是可能的,對於上面顯示的用例 - 請參閱下面的答案。 –

2

我認爲可以避免這個錯誤。警告 - 我是新來的流浪漢。然而,這似乎是你在找什麼:

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' 

如果你能預見所有你認爲會被傳遞給你的無業遊民調用的命令行選項,你可以將它們添加到getopts的數組,然後就不理您想要通過默認流浪處理來處理的元素。

+0

有點破解,但這個工程;) – 4c74356b41

相關問題