Encoding::CompatibilityError の対処方法と cannot load such file -- 2.2/gherkin_lexer_en
rubyのバージョンを上げて以来、Encoding::CompatibilityError というエラーが発生。
Encoding::CompatibilityError は互換性のない文字列連結などで発生するらしい。
けど、ソースいじってないし実行マシンの設定も変えてない。
実行時のログを見てみると
WARNING: cannot load such file -- 2.3/gherkin_lexer_en
"cannot load such file" 再び。
今度は「gherkin_lexer_en」ってのが見つからないよって言われた。
なんだこのファイルは。GENKINGと空目してしまう。
調べたらfeatureファイルの書式の1つに「Gherkin 書式」というものがあるそう。
このファイルが読めてないせいで、エンコーディングがうまくいかずにエラーになってるっぽい。
下記ページに対処方法が載っている
watir - cucumber Couldn't load 2.1/gherkin_lexer_en - Stack Overflow
対処方法
1.gherkin 2.12.2 をインストールする
2.c_lexer.rbのprefix = の部分を置き換える
・ファイルの場所
例)version2.3.0の場合
C:\Ruby23-x64\lib\ruby\gems\2.3.0\gems\gherkin-2.12.2-x86-mingw32\lib\gherkin
・元々書いてある以下をコメントアウトして、
prefix = RbConfig::CONFIG['arch'] =~ /mswin|mingw/ ? "#{RbConfig::CONFIG['MAJOR']}.#{RbConfig::CONFIG['MINOR']}/" : ''
・以下を追記
prefix = ''
注意点
※ 上記対応は動かしているrubyのバージョンのファイルに対して行います。
インストールしたrubyのディレクトリ以下それぞれにファイルが作られているため。。
これは2.2系
これは2.3系
関連:rubyの最新バージョンをインストールするとろくなことがない (cannot load such file -- ffi_c (LoadError)) - 文系seの備忘録
ただし・・・
・バージョンアップするごとに毎回書き換えるのが面倒
・別の環境で実行したときにわざわざ書き換えなきゃいけないのは面倒
という問題があるかと思います。
その場合は実行時にcopyコマンドでファイルごと上書きするよう設定しておくと良いと思います。
例) バグ対応パッチをどこかにおいておいて、それを2.3系にコピーする
copy /Y xxx\c_lexer.rb C:\Ruby23-x64\lib\ruby\gems\2.3.0\gems\gherkin-2.12.2-x86-mingw32\lib\gherkin\c_lexer.rb
※ 別のrubyバージョンを使うときにはcopy先のフォルダを変更すればOKです
再度実行してみたところ、Encoding::CompatibilityError は消えました。