TL;DR
とある日の朝、RORのプロジェクトを開発環境で立ち上げようとしたところ、こんなエラーが吐かれた。そのデバッグ記録です。
Debug
いつものように開発環境のRORプロジェクトをgem foremanで立ち上げようとした。
$ ~/project_dir bundle exec foreman start -f Procfile.dev
ところがこんなエラーが、、
#=> Your Ruby version is 2.5.3, but your Gemfile specified 2.5.1
なるほど、参照先のruby versionとGemfileで設定しているruby versionが違うらしい。素直にGemfileのruby versionを参照先と合わせて2.5.3に設定しよう。
設定した。もう一回起動。
$ ~/project_dir bundle exec foreman start -f Procfile.dev
しかし今度は、
#=> 11:18:47 frontend.1 | exited with code 1
webpacl-dev-serverが異常終了した。なんでだ?webpack-dev-serverだけ実行してみる。
$ ~/project_dir ./bin/webpack-dev-server
#=> Your Ruby version is 2.5.1, but your Gemfile specified 2.5.3
今度は、Gemfileに設定したruby 2.5.3がだめなのか笑
bundlerとwebpack-dev-serverでrubyの参照先が違うんだろうな。
ちなみに、
$ rbenv versions
system
2.4.1
2.5.0
* 2.5.1
$ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17]
All the 2.5.1笑
一体いつどこに入れた2.5.3だろう?そういえば昨日ハイボールを飲みながらdjangoをいじってたときになんか2.5.3っていう数字を見た気も、、、まぁどうでもいいか。
Debug再開。 bundler
はどこだ?
$ which bundler
#=> /usr/local/bin/bundler
中身を見てみる。
$ cat /usr/local/bin/bundle
#!/usr/local/opt/ruby/bin/ruby
#
# This file was generated by RubyGems.
#
# The application 'bundler' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
version = ">= 0.a"
if ARGV.first
str = ARGV.first
str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then
version = $1
ARGV.shift
end
end
if Gem.respond_to?(:activate_bin_path)
load Gem.activate_bin_path('bundler', 'bundle', version)
else
gem "bundler", version
load Gem.bin_path("bundler", "bundle", version)
end
なるほどshebangによると、参照先は #!/usr/local/opt/ruby/bin/ruby
か。
rbenvでrubyのversionは管理してるし、参照先を直接変えちゃおうか。うまくいくだろう。
$ sudo vim /usr/local/bin/bundler
あなたの環境でのpathを設定してください。
#!/usr/local/.rbenv/shims/ruby #変更!
#
# This file was generated by RubyGems.
#
# The application 'bundler' is installed as part of a gem, and
# this file is here to facilitate running it.
#
require 'rubygems'
version = ">= 0.a"
if ARGV.first
str = ARGV.first
str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
if str =~ /\A_(.*)_\z/ and Gem::Version.correct?($1) then
version = $1
ARGV.shift
end
end
if Gem.respond_to?(:activate_bin_path)
load Gem.activate_bin_path('bundler', 'bundle', version)
else
gem "bundler", version
load Gem.bin_path("bundler", "bundle", version)
end
ではもう一度、
$ ~/project_dir bundle exec foreman start -f Procfile.dev
11:34:13 web.1 | started with pid 19518
11:34:13 frontend.1 | started with pid 19519
11:34:17 frontend.1 | Project is running at http://localhost:3035/
11:34:17 frontend.1 | webpack output is served from /packs/
11:34:17 frontend.1 | Content not from webpack is served from ***
11:34:20 frontend.1 | No parser and no filepath given, using 'babylon' the parser now but this will throw an error in the future. Please specify a parser or a filepath so one can be inferred.
11:34:20 frontend.1 | No parser and no filepath given, using 'babylon' the parser now but this will throw an error in the future. Please specify a parser or a filepath so one can be inferred.
11:34:25 web.1 | => Booting Puma
11:34:25 web.1 | => Rails 5.2.1 application starting in development
11:34:25 web.1 | => Run `rails server -h` for more startup options
11:34:27 web.1 | Puma starting in single mode...
11:34:27 web.1 | * Version 3.12.0 (ruby 2.5.1-p57), codename: Llamas in Pajamas
11:34:27 web.1 | * Min threads: 5, max threads: 5
11:34:27 web.1 | * Environment: development
11:34:27 web.1 | * Listening on tcp://localhost:5000
11:34:27 web.1 | Use Ctrl-C to stop
お、動いた!
まとめ
お使いのrubyの参照先を確認して、各プロセスを担う方たちに適切な参照先を割り当てるようにdebugしましょう、といった感じでした