rspec-puppet with ruby 1.8.7 给出 "unexpected ')'" 错误,但所有其他 ruby 版本都有效

rspec-puppet with ruby 1.8.7 gives "unexpected ')'" error but all other ruby versions work

在为 Puppet 模块开发规范测试时,TravisCI 会针对各种 Ruby/Gem/Puppet 版本进行测试。通常所有测试都适用于所有版本,除了 Ruby 1.8.7。那里的测试甚至没有开始。相反,您会收到一条错误消息,其中提到 configuration.rb:1105syntax error, unexpected ')'.

这是一个 example

/home/travis/.rvm/gems/ruby-1.8.7-p374/gems/rspec-core-3.1.7/lib/rspec/core/configuration.rb:1105:in `load': /home/travis/build/puppetlabs/puppetlabs-haproxy/spec/classes/haproxy_spec.rb:347: syntax error, unexpected ')' (SyntaxError)
/home/travis/build/puppetlabs/puppetlabs-haproxy/spec/classes/haproxy_spec.rb:355: syntax error, unexpected kDO_BLOCK, expecting kEND
/home/travis/build/puppetlabs/puppetlabs-haproxy/spec/classes/haproxy_spec.rb:364: syntax error, unexpected $end, expecting kEND

我在多个项目中看到过这个。

如何解决这个问题?

问题是 ruby-1.8.7 对多余的逗号不太宽容。如果您查看带有 configuration.rb:1105 的行之后的行,它会提到一个文件。那是有额外逗号或其他问题的文件。在上面的例子中,问题是haproxy_spec.rb:355;在较旧的 Ruby 中,散列的最后一行必须省略逗号。

这是触发错误的版本与修复错误的版本之间的差异:

         it 'should create directory /etc/haproxy' do
           subject.should contain_file('/etc/haproxy').with(
-            'ensure' => 'directory',
+            'ensure' => 'directory'
           )
         end
       end

正如您将在下一个 TravisCI build 中看到的那样,这解决了它。