環境
- macOS:BigSur
- RubyMine:2020.3
- Ruby:2.7.1
- Rubocop:1.4.2
- parser:2.7.2.0
Rubocopからの警告
Rubocop実行時にいつの間にか、以下の警告が出るようになっていました。
please seeのURLに飛んで、いろいろ調べてみたところ
- RubocopはRubyのRubyにwhitequark/parser: A Ruby parser.を使用する
- RubyはパッチリリースごとにRubyへのバックポート*1を盛り込むことがある。Rubyを担うparserはこれに対応する必要がある。
- 上記に対応するため、parserは1つのバージョンで複数のマイナーバージョンをサポートできないそう(parser2.7.2.0では、Ruby2.7.2のみをサポートしていて、2.7.1をサポートしていない)
- そのため、Rubyのバージョン(2.7.1)とparserの対応しているバージョン(2.7.2)が異なると警告が出る。
今回事象が発生している環境では特にRubocopのバージョンもしていなかったので、parserも最新版が入っているみたいでした。
参考記事
parserのバージョンを下げる
Rubyに合わせてparserを2.7.2.0未満に下げることでエラーを解消します。
1.Gemfileにparserのバージョンを追記する
2.parserをupdateするGemfile.lockで既にparserの2.7.2.0が指定されているので、updateしていく。
3.Rubocopを実行する
見事エラー解消!
実は(今回は)無視してもいい警告
* Bump 2.7 branch to 2.7.2 by koic · Pull Request #748 · whitequark/parser
Ruby 2.7.2 has been released.https://www.ruby-lang.org/en/news/2020/10/02/ruby-2-7-2-released/
It seems like no changes have been made to ruby27.y where Parser gem should be changed (backported).ruby/ruby@v2_7_1…v2_7_2
特にRuby2.7.1と2.7.2の間に変化はないっぽいので、今回はこの警告を無視してもRubocopの実行結果は変わらなそうでした。
でも、ドキュメント読んだりエラー解消したり、いろいろと勉強になったのでよしとしましょう!
以下、調査過程のメモ
原文
whitequark/parser: A Ruby parser.
単語・語句・構文
Ruby MRI
:CRuby(Matz’ Ruby Implementation)backport
:あるバージョンのソフトウェアに追加した機能やセキュリティ対策などの改良を、それより以前のバージョンのソフトウェアにも取り込むこと。c5013452
、04bb9d6b
:いずれもparse.y
におけるバックポートの例。lexer quirks
:lexerが字句解析。字句解析の特徴といったところ?
内容に関する知識
parse.y
- ruby/parse.y at master · ruby/ruby
parse.y
はRubyのRubyのルールを記述したもの(記述されたPGは、字句解析→Rubyの順に解析される)- yaccは、パーサを自動生成するツール。
.y
という拡張子のファイルを入力とし、 Cのソースを出力する。 - Ruby開発者・まつもとゆきひろ氏の新言語「Streem」のソースコードを読んでみよう! ~ 文法と構造を規定する「lex.l」と「parse.y」 (1/4):CodeZine(コードジン)
- プログラミング言語を作る/yaccとlex
疑問点と思考過程
- 中の人が言及している記事があった:Parser gem のバージョニングと RuboCop の TargetRubyVersion - koicの日記
- RubyのバージョンアップごとにrubocopのRubyを担うparserもそれに追随するが、各バージョンのparserは複数のパッチバージョン (2.7 系, 2.6 系, 2.5 系, 2.4 系, 2.3 系…) のみ。
Gemfile.lock
を確認してみるとparser (2.7.2.0)
、つまりは2.7系では2.7.2のみに対応しているので、今回のような警告が発生している。- * Bump 2.7 branch to 2.7.2 by koic · Pull Request #748 · whitequark/parserで言及されているように、特に影響はなさそう。
訳文(deepLと少し自分)
*1:あるバージョンのソフトウェアに追加した機能やセキュリティ対策などの改良を、それより以前のバージョンのソフトウェアにも取り込むこと。