shmn7iii

Blog

Rubocop が bin/bundle を書き換えてくれると詰む

Rubocop さんは親切なので bin/bundle も書き換えてくれます。

これを

... def gemfile gemfile = ENV["BUNDLE_GEMFILE"] return gemfile if gemfile && !gemfile.empty? File.expand_path("../../Gemfile", __FILE__) end ...

こうしてくれる

... def gemfile gemfile = ENV['BUNDLE_GEMFILE'] return gemfile if gemfile.present? File.expand_path('../Gemfile', __dir__) end ...

んだけどこれだと bin/bundle はエラーを吐きます。

$ bin/bundle bin/bundle:42:in `gemfile': undefined method `present?' for nil:NilClass (NoMethodError) return gemfile if gemfile.present? ^^^^^^^^^ from bin/bundle:84:in `load_bundler!' from bin/bundle:110:in `<main>'

原因

Rubocopくん

ここが冗長なので

return gemfile if gemfile && !gemfile.empty?

こうしてくれた

return gemfile if gemfile.present?

正しい。間違ってはない。がしかし。

present? メソッドさんが実は Rails 独自メソッド。Ruby の組み込みメソッドではない。

$ irb >> nil.present? (irb):1:in `<main>': undefined method `present?' for nil:NilClass (NoMethodError) from /Users/shmn7iii/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/irb-1.4.1/exe/irb:11:in `<top (required)>' from /Users/shmn7iii/.rbenv/versions/3.1.1/bin/irb:25:in `load' from /Users/shmn7iii/.rbenv/versions/3.1.1/bin/irb:25:in `<main>' >> "aa".present? (irb):2:in `<main>': undefined method `present?' for "aa":String (NoMethodError) Did you mean? prepend from /Users/shmn7iii/.rbenv/versions/3.1.1/lib/ruby/gems/3.1.0/gems/irb-1.4.1/exe/irb:11:in `<top (required)>' from /Users/shmn7iii/.rbenv/versions/3.1.1/bin/irb:25:in `load' from /Users/shmn7iii/.rbenv/versions/3.1.1/bin/irb:25:in `<main>' $ rails console >> nil.present? => false >> "aa".present? => true

Rails プロジェクトでの Rubocop なので親切に Rails のメソッドを使って改善してくれる。

がしかし bin/bundle は Rubyスクリプトなので、Ruby にはない present? メソッドで NoMethodError が起こってしまう。というオチでした。

対策

rubocop.yml で正しく除外設定をしよう

AllCops: Exclude: - 'bin/**/*' ...