0

有一个奇怪的问题,我有一个似乎使用多个版本的 Ruby 的 Rake 任务。当一个失败时,它似乎会尝试另一个。

细节

  • 运行 10.6.5 的 MacBook
  • rvm 1.1.0
  • 红宝石:1.8.7-p302、ree-1.8.7-2010.02、ruby-1.9.2-p0
  • 耙子 0.8.7
  • 宝石 1.3.7

  • Veewee(使用 Opcode.com、Vagrant 和 Chef 配置虚拟机)


我不完全确定错误问题的具体细节,但因为它可能是 Veewee 本身的问题。所以,我想做的是建立一个基于 veewee 定义的新盒子。该命令失败并显示有关缺少方法的错误 - 但有趣的是它是如何失败的。

错误

我设法弄清楚,如果我只用 RVM 安装了一个 Ruby,它就会失败。如果我安装了多个 Ruby,它会在同一个地方失败,但似乎在另一个解释器中继续执行。

这是两个不同的剪辑控制台输出。我已经剪裁了它们的大小。每个错误的完整输出都可以作为 gist 获得

安装了一个 Ruby 版本

这是当我在 RVM 中只有一个 Ruby 版本(1.8.7)时运行的命令

boudica:veewee john$ rvm rake build['mettabox'] --trace

rvm 1.1.0 by Wayne E. Seguin (wayneeseguin@gmail.com) [http://rvm.beginrescueend.com/]

(in /Users/john/Work/veewee)
** Invoke build (first_time)
** Execute build

…

creating new harddrive
rake aborted!
undefined method `max_vdi_size' for #<VirtualBox::SystemProperties:0x102d6af80>
/Users/john/.rvm/gems/ruby-1.8.7-p302/gems/virtualbox-0.8.3/lib/virtualbox/abstract_model/dirty.rb:172:in `method_missing'

<------ stacktraces cut ---------->

/Users/john/.rvm/gems/ruby-1.8.7-p302/gems/rake-0.8.7/bin/rake:31
/Users/john/.rvm/gems/ruby-1.8.7-p302@global/bin/rake:19:in `load'
/Users/john/.rvm/gems/ruby-1.8.7-p302@global/bin/rake:19

多个 Ruby 版本

这是在 RVM 中使用三个版本的 Ruby 运行的相同命令。在此之前,我使用了“rvm use 1.8.7”。同样,我不知道具体错误的细节有多重要——我感兴趣的是有三个单独的错误——每个错误都有自己的堆栈跟踪——并且每个错误都在不同的 Ruby 解释器中。查看每个堆栈跟踪的底部,您会发现它们都来自不同的解释器位置 - 首先是 ree-1.8.7,然后是 ruby​​-1.8.7,然后是 ruby​​-1.9.2:

boudica:veewee john$ rvm rake build['mettabox'] --trace

rvm 1.1.0 by Wayne E. Seguin (wayneeseguin@gmail.com) [http://rvm.beginrescueend.com/]

(in /Users/john/Work/veewee)
** Invoke build (first_time)
** Execute build

…

creating new harddrive
rake aborted!
undefined method `max_vdi_size' for #<VirtualBox::SystemProperties:0x1059dd608>
/Users/john/.rvm/gems/ree-1.8.7-2010.02/gems/virtualbox-0.8.3/lib/virtualbox/abstract_model/dirty.rb:172:in `method_missing'

…

/Users/john/.rvm/gems/ree-1.8.7-2010.02/gems/rake-0.8.7/bin/rake:31
/Users/john/.rvm/gems/ree-1.8.7-2010.02@global/bin/rake:19:in `load'
/Users/john/.rvm/gems/ree-1.8.7-2010.02@global/bin/rake:19
(in /Users/john/Work/veewee)
** Invoke build (first_time)
** Execute build
isofile ubuntu-10.04.1-server-amd64.iso is available
["a1b857f92eecaf9f0a31ecfc39dee906", "30b5c6fdddbfe7b397fe506400be698d"]
[]
Last good state: -1
Current step: 0
last good state -1
destroying machine+disks
(re-)executing step 0-initial-a1b857f92eecaf9f0a31ecfc39dee906
VBoxManage: error: Machine settings file '/Users/john/VirtualBox VMs/mettabox/mettabox.vbox' already exists
VBoxManage: error: Details: code VBOX_E_FILE_ERROR (0x80bb0004), component Machine, interface IMachine, callee nsISupports
Context: "CreateMachine(bstrSettingsFile.raw(), name.raw(), osTypeId.raw(), Guid(id).toUtf16().raw(), FALSE , machine.asOutParam())" at line 247 of file VBoxManageMisc.cpp
rake aborted!
undefined method `memory_size=' for nil:NilClass
/Users/john/Work/veewee/lib/veewee/session.rb:303:in `create_vm'
/Users/john/Work/veewee/lib/veewee/session.rb:166:in `build'
/Users/john/Work/veewee/lib/veewee/session.rb:560:in `transaction'
/Users/john/Work/veewee/lib/veewee/session.rb:163:in `build'
/Users/john/Work/veewee/Rakefile:87
/Users/john/.rvm/gems/ruby-1.8.7-p302/gems/rake-0.8.7/lib/rake.rb:636:in `call'
/Users/john/.rvm/gems/ruby-1.8.7-p302/gems/rake-0.8.7/lib/rake.rb:636:in `execute'
/Users/john/.rvm/gems/ruby-1.8.7-p302/gems/rake-0.8.7/lib/rake.rb:631:in `each'
…

/Users/john/.rvm/gems/ruby-1.8.7-p302/gems/rake-0.8.7/bin/rake:31
/Users/john/.rvm/gems/ruby-1.8.7-p302@global/bin/rake:19:in `load'
/Users/john/.rvm/gems/ruby-1.8.7-p302@global/bin/rake:19
(in /Users/john/Work/veewee)
** Invoke build (first_time)
** Execute build
isofile ubuntu-10.04.1-server-amd64.iso is available
["a9c4ab3257e1da3479c984eae9905c2a", "30b5c6fdddbfe7b397fe506400be698d"]
[]
Last good state: -1
Current step: 0
last good state -1
(re-)executing step 0-initial-a9c4ab3257e1da3479c984eae9905c2a
VBoxManage: error: Machine settings file '/Users/john/VirtualBox VMs/mettabox/mettabox.vbox' already exists
VBoxManage: error: Details: code VBOX_E_FILE_ERROR (0x80bb0004), component Machine, interface IMachine, callee nsISupports
Context: "CreateMachine(bstrSettingsFile.raw(), name.raw(), osTypeId.raw(), Guid(id).toUtf16().raw(), FALSE , machine.asOutParam())" at line 247 of file VBoxManageMisc.cpp
rake aborted!
undefined method `memory_size=' for nil:NilClass
/Users/john/Work/veewee/lib/veewee/session.rb:303:in `create_vm'
/Users/john/Work/veewee/lib/veewee/session.rb:166:in `block in build'
/Users/john/Work/veewee/lib/veewee/session.rb:560:in `transaction'
/Users/john/Work/veewee/lib/veewee/session.rb:163:in `build'
/Users/john/Work/veewee/Rakefile:87:in `block in <top (required)>'
/Users/john/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/rake.rb:634:in `call'
/Users/john/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/rake.rb:634:in `block in execute'
…

/Users/john/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/rake.rb:2013:in `top_level'
/Users/john/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1/rake.rb:1992:in `run'
/Users/john/.rvm/rubies/ruby-1.9.2-p0/bin/rake:35:in `<main>'

直到我们到达最后安装的 Ruby 版本,执行才会停止。

讨论

有谁知道这里发生了什么?有没有人见过这种类似“故障转移”的行为?第一个异常不会像使用一个解释器那样停止执行,这对我来说似乎很奇怪,但我想知道在安装 RVM 时是否发生了我们 Ruby 开发人员没有考虑的事情。

4

2 回答 2

1

由于rvm rake应该在 RVM 的控制下对所有版本的 Ruby 运行 rake 任务,我认为它正在做预期的事情:rvm help显示:

  rake       - runs a rake task against specified and/or all rubies

特别请求rake节目帮助:

$ rvm 帮助耙
耙

  RVM 允许您跨多个 ruby​​ 版本运行 rake 任务,例如:

    ∴ rvm 1.8.6,1.9.1 耙规格

JSON 总结

  在单词 'rake' 之前添加 --json 标志,并将在运行结束时打印出 JSON 摘要。

YAML 总结

  在单词 'rake' 之前添加 --yaml 标志,并在运行结束时打印出 YAML 摘要。

如果您尝试运行 rake 任务,则不必涉及 RVM。首先使用 RVM 设置所需的 Ruby 版本,然后运行任务:

rvm 1.9.2
rake some_task
于 2011-01-29T21:53:22.527 回答
0

您提到的错误不是不同 ruby​​ vms 的问题。是不是因为新的流浪者需要它而升级到 Virtualbox 4.X?

veewee 所依赖的 virtualbox 的一些功能(尚未)移植到 Virtualbox 4.x

我现在通过直接执行 virtualbox 命令来解决这个问题。有趣的是,在实施更新时,我遇到了完全相同的错误。

帕特里克(veewee 启发者)

于 2011-02-04T14:23:42.130 回答