Vagrantfile检查是否已在.vagrantuser中定义变量

时间:2014-02-16 08:55:26

标签: ruby vagrant

我在OS X 10.9上使用Vagrant 1.4.2和Nugrant plug-in 1.4.1。在我的.vagrantfile中,我有以下内容:

myvar:
  a: 'hello'

我可以像a那样访问Vagrantfileputs "* The value of config.user.myvar.a is %s." % [config.user.myvar.a] 的值:

vagrant up

以上代码在我发出* The value of config.user.myvar.a is hello. 时打印以下内容:

a

但是,我想设置defined?可选,所以我添加了一个Ruby config.user.myvar.a检查以查看是否已定义puts。为了便于说明,我保留原始if defined? (config.user.myvar.a) puts "* config.user.myvar.a EXISTS (%s)" % [config.user.myvar.a] else puts "* config.user.myvar.a DOES NOT EXIST" end puts "* The value of config.user.myvar.a is %s." % [config.user.myvar.a] 命令:

* config.user.myvar.a DOES NOT EXIST
* The value of config.user.myvar.a is hello.

这会产生以下矛盾:

config.user.myvar.a

为什么我可以打印defined?的值,但不能使用{{1}}

检测它

2 个答案:

答案 0 :(得分:1)

我不熟悉该插件,但它似乎使用Ruby的method_missing从Hash中获取配置密钥,但它没有定义respond_to?方法。因此define?无效。

相反,似乎有has?方法,所以你可以尝试:

if config.user.myvar.has?(:a)

或者,如果未设置,则值为nil

if !config.user.myvar.a.nil?

答案 1 :(得分:0)

使用 tmatilai 的输入,我发现问题出现是因为Nugrant插件不支持Ruby的define?。其他人有similar problems using has? with version 1.4.1 of the Nugrant plug-in,已在版本1.4.2中修复。

我已升级到Nugrant 1.4.2,并发现使用myvar检查if config.user.has?(:myvar)现在可以正常运行,但检查myvar.a if defined?(config.user.myvar.a)if config.user.myvar.has?(:a)在未定义myvar.a时导致未定义的方法错误。不是Ruby程序员,我决定改变策略,简单地将.vagrantuser中的结构展平为:

myvar_a: 'hello'
myvar_b: 'hallo'

而不是:

myvar:
   a: 'hello'
   b: 'hallo'

现在我只需检查myvar_amyvar_b

if config.user.has?(:myvar_a) 
  puts "* config.user.myvar_a is defined: %s" % [config.user.myvar_a]
else
 puts "* config.user.myvar_a is NOT defined."
end

这是一种可接受的解决方法。