1

1.8.7次のgemファイルで実行されるRubyバージョンを使用してパペットモジュールを開発し、bundle installrspecテストが正常に機能しました(パペットも実行されました):

source 'https://rubygems.org'

if puppetversion = ENV['PUPPET_GEM_VERSION']
  gem 'puppet', puppetversion, :require => false
else
  gem 'puppet', '3.7.5'
end

gem 'metadata-json-lint'
gem 'puppetlabs_spec_helper', '>= 0.1.0'
gem 'puppet-lint', '>= 1.0.0'
gem 'facter', '>= 1.7.0'
gem 'rspec-puppet-facts'

# rspec must be v2 for ruby 1.8.7
if RUBY_VERSION >= '1.8.7' and RUBY_VERSION < '1.9'
  gem 'rspec', '~> 2.0'
end

ただし、Ruby を使用する CI サーバーでbundle install同じことを行ったときに、次の rspec エラーが発生しました。Gemfile1.9.3

ここで詳細なエラーを参照してください

一般的なエラーは次のとおりです。

Puppet::Error:
       Failed to parse template silex/var/config/settings.json.erb:
         Filepath: /var/tmp/silex/spec/fixtures/modules/silex/templates/var/config/settings.json.erb
         Line: 4
         Detail: undefined method `each_with_index' for "default":String

メソッドを使用するテンプレートeach_with_index:

{
    "elasticsearch.settings": {
        "connections": [
        <% @elastic_hosts.each_with_index do |host,i| -%>
        {"host":"<%= host['ip'] %>", "port": <%= host['port'] %> }<%= ',' if i < (@elastic_hosts.size - 1) -%>
        <% end -%>
        ],
        "index": "<%= @elastic_index %>"
    }
    },
    "cache.lifetime": <%= @elastic_cache_lifetime %>,
    "environment": "dev",
    "trusted": [
        <% @trusted_hosts.each_with_index do |host,i| -%>
        {"host":"<%= host['host'] %>"}<%= ',' if i < (@trusted_hosts.size - 1) -%>
        <% end -%>
    ],
    "homepage.settings": {
      "hero.count": 20,
      "list.count": 20
    }
}

別のバージョンのルビーでこれが失敗する理由を理解できていませんか? ルビーも試してみまし2.1.1たが、同じ結果でした。1.8.7結果は、Ruby を使用した CI サーバー(モジュールの開発に使用したのと同じバージョン)でのみ成功します。

更新 1

elastic_hostsはハッシュ マップであり、文字列が失敗したためです。これを (別のハッシュ マップ) と共に修正したtrusted_hosts結果、ほとんどのテストはパスしましたが、エラーは解決しません。

ここでエラーを参照してください

: エラーは、上で強調表示されている一般的なエラーから変更されていません。

上記のテンプレート ファイルも完全な内容で更新しました。

私の構成仕様ファイル

私の構成仕様ファイルを見ると、defaultどこにも文字列として指定していませんが、それはエラーであることがわかります..

修理

疑わしいように、私の初期仕様クラスにはデフォルトが設定されており、hiera ルックアップを追加して問題elastic_hoststrusted_hosts修正しました。

更新 2

1.8.7この動作は、バージョンとバージョン >の間で再現可能1.9.3です。ハッシュの扱い方に何か関係があるようです。

4

1 に答える 1

3

答えは簡単です。Ruby のeach新しいバージョンからメソッドが削除されたからです。理由の 1 つは、メソッドがUTF-8文字列のコンテキストで混乱していたことです:各 charまたは各 byteeachを反復処理しますか?

しかし、each_charそれを次のように組み合わせることができますwith_index

string.each_char.with_index do |char, i|
  # ...
end

@elastic_hostsさらに、スニペット内で明らかに配列であるはずのメソッドを呼び出しますhosts。しかし、エラー メッセージ@elastic_hostsは、 が stringであることを示していますdefault。したがって、メソッド呼び出しが失敗するのは理にかなっていeach_with_indexますが、反復自体は意味をなさないようです。@elastic_hostsが正しく設定されているかどうかを確認することをお勧めします。

于 2015-11-15T07:39:48.760 に答える