如何使 Vagrant 中的虚拟框可选?

How to make virtual boxes in Vagrant optional?

我遇到了 Vagrant 的一个小问题。
在Vagrant文​​件中,我们定义了几个基本使用相同配置的virtual box的列表,由vagrant设置:

boxes = [
{
  :name => "box1",
  :vmnumber => "1",
  :mem => "256",
  :cpu => "1"
},
{
  :name => "box2",
  :vmnumber => "6",
  :mem => "256",
  :cpu => "1"
},
...
]

... 并且以相同的格式,第二个列表称为 boxes_optional。例如,当调用 vagrant up 时,vagrant 会循环列出并启动 VM。到目前为止,一切都很好。

我的问题是我想让用户选择启动boxes_optional中的框。据我所知你不能在vagrant up命令中添加更多的参数,你只能通过ENV[variable]查询环境变量,但这样有点不方便。

是否有另一种更优雅的方式使这些框成为可选的?我对 Vagrant 和 Ruby 还很陌生,我还没有 google 一个好的解决方案,所以我基本上是在这里寻找想法。

谢谢并致以最诚挚的问候,

/tehK

你应该可以这样做:

boxes += optional_boxes if ENV['START_OPTIONAL_BOXES']

boxes.each |box| do
  # start box here
end

这样,如果设置了 START_OPTIONAL_BOXES 环境变量,您将把两个列表合并为一个,如果没有设置,则只启动强制框。

更新答案

玩了一下 vagrant,几乎是在写一个插件,但在它的源代码中发现它实际上对它的参数没有那么严格,如果它们在命令之前并且在前面加上破折号或双破折号(与命令不同).

所以需要这样调用:

$ vagrant --without-optional-boxes up

# or, works too: #

$ vagrant -without-optional-boxes up

现在它不会对未知参数狂吠,而你仍然可以从 ARGV:

获取它
boxes += optional_boxes unless (ARGV[0] == "--without-optional-boxes")