谜团:chef-client/knife:他们忽略了 knife.rb 和 client.rb 中的任何错误

mystery: chef-client/knife: they are ignoring any error in knife.rb and client.rb

我碰巧在 ~/.chef/knife.rb/etc/chef/client.rb 中发现, knife 或 chef-client 将忽略任何错误。

...
a_non_exist_method a_non_exist_var
...
puts "==== #{a_non_exist_method}"

完全没问题,即使 a_non_exist_method a_non_exist_var 绝对错误。 结果当然是

==== 

chef-client/knife如何执行client.rb/knife.rb?

PS:我知道knife.rbclient.rb是一个配置文件,不应该在那里添加用户程序逻辑,只是好奇为什么它没有错误地放入任何东西?

它被评估为一个Chef::Config class实例,它继承自mixlib-config,这取决于你如何测试它可能不是严格模式(relevant code)

所以当你没有设置严格模式时,你可能会在没有警告的情况下忽略 属性,也不会出错。

你的 puts 只是被评估为标准 ruby,字符串插值搜索一个变量,即使你调用它 a_non_exist_method 并且从 ruby 鸭子打字,它是一个零值,作为字符串插入的是一个空字符串。