Techioz Blog

バンドラー: コマンドのロードに失敗しました: puma

概要

CML heroku localでheroku localコマンドを実行しようとしています。 heroku local コマンドを使用すると、ローカル開発環境で問題をトラブルシューティングするために Heroku にプッシュされたときと同じ方法で、プロジェクトをローカルで起動できます。 Gemfile.lock を削除しようとしましたが、バンドルインストールを再度実行しても機能しませんでした。また、コマンドbundle exec heroku localを使用してみましたが、依然として同じエラーメッセージが表示されます。

CML 経由で home-brew を使用して Ruby をインストールしました。 Ruby-V の出力: Ruby 2.7.6p219 (2022-04-12 リビジョン c9c2245c0a) [arm64-darwin21]。ファイル /Users/itayayuuicularu/.rbenv/versions/3.3.1/bin/ruby の出力: Users/chris/.rubies/ruby-2.7.6/bin/ruby: Mach-O 64 ビット実行可能ファイル arm64。

私のGemFile:

source "https://rubygems.org"

ruby "2.7.6"
gem "sinatra", "~>1.4.7"
gem "sinatra-contrib"
gem "erubis"

group :production do
  gem "puma"
end

私の Gemfile.lock:

GEM
  remote: https://rubygems.org/
  specs:
    backports (3.23.0)
    erubis (2.7.0)
    multi_json (1.15.0)
    nio4r (2.5.8)
    puma (6.0.0)
      nio4r (~> 2.0)
    rack (1.6.13)
    rack-protection (1.5.5)
      rack
    rack-test (2.0.2)
      rack (>= 1.3)
    sinatra (1.4.8)
      rack (~> 1.5)
      rack-protection (~> 1.4)
      tilt (>= 1.3, < 3)
    sinatra-contrib (1.4.7)
      backports (>= 2.0)
      multi_json
      rack-protection
      rack-test
      sinatra (~> 1.4.0)
      tilt (>= 1.3, < 3)
    tilt (2.0.11)

PLATFORMS
  arm64-darwin-21

DEPENDENCIES
  erubis
  puma
  sinatra (~> 1.4.7)
  sinatra-contrib

RUBY VERSION
   ruby 2.7.6p219

BUNDLED WITH
   2.3.26

期待される戻り値:

$ heroku local
forego | starting web.1 on port 5000
web.1  | Puma starting in single mode...
web.1  | * Listening on tcp://0.0.0.0:5000
web.1  | Use Ctrl-C to stop

実際の戻り値:

bundler: failed to load command: puma (/Users/chris/.gem/ruby/2.7.6/bin/puma)
4:29:41 PM web.1 |  /Users/chris/.gem/ruby/2.7.6/gems/puma-6.0.0/lib/puma.rb:14:in `require': dlopen(/Users/chris/.gem/ruby/2.7.6/gems/puma-6.0.0/lib/puma/puma_http11.bundle, 0x0009): tried: '/Users/chris/.gem/ruby/2.7.6/gems/puma-6.0.0/lib/puma/puma_http11.bundle' (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64')), '/System/Volumes/Preboot/Cryptexes/OS/Users/chris/.gem/ruby/2.7.6/gems/puma-6.0.0/lib/puma/puma_http11.bundle' (no such file), '/Users/chris/.gem/ruby/2.7.6/gems/puma-6.0.0
4:29:41 PM web.1 |  >  /lib/puma/puma_http11.bundle' (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64')) - /Users/chris/.gem/ruby/2.7.6/gems/puma-6.0.0/lib/puma/puma_http11.bundle (LoadError)
4:29:41 PM web.1 |      from /Users/chris/.gem/ruby/2.7.6/gems/puma-6.0.0/lib/puma.rb:14:in `<top (required)>'
4:29:41 PM web.1 |      from /Users/chris/.gem/ruby/2.7.6/gems/puma-6.0.0/lib/puma/cli.rb:6:in `require_relative'
4:29:41 PM web.1 |      from /Users/chris/.gem/ruby/2.7.6/gems/puma-6.0.0/lib/puma/cli.rb:6:in `<top (required)>'
4:29:41 PM web.1 |      from /Users/chris/.gem/ruby/2.7.6/gems/puma-6.0.0/bin/puma:6:in `require'
4:29:41 PM web.1 |      from /Users/chris/.gem/ruby/2.7.6/gems/puma-6.0.0/bin/puma:6:in `<top (required)>'
4:29:41 PM web.1 |      from /Users/chris/.gem/ruby/2.7.6/bin/puma:25:in `load'
4:29:41 PM web.1 |      from /Users/chris/.gem/ruby/2.7.6/bin/puma:25:in `<top (required)>'
4:29:41 PM web.1 |      from /Users/chris/.gem/ruby/2.7.6/gems/bundler-2.3.26/lib/bundler/cli/exec.rb:58:in `load'
4:29:41 PM web.1 |      from /Users/chris/.gem/ruby/2.7.6/gems/bundler-2.3.26/lib/bundler/cli/exec.rb:58:in `kernel_load'
4:29:41 PM web.1 |      from /Users/chris/.gem/ruby/2.7.6/gems/bundler-2.3.26/lib/bundler/cli/exec.rb:23:in `run'
4:29:41 PM web.1 |      from /Users/chris/.gem/ruby/2.7.6/gems/bundler-2.3.26/lib/bundler/cli.rb:486:in `exec'
4:29:41 PM web.1 |      from /Users/chris/.gem/ruby/2.7.6/gems/bundler-2.3.26/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
4:29:41 PM web.1 |      from /Users/chris/.gem/ruby/2.7.6/gems/bundler-2.3.26/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
4:29:41 PM web.1 |      from /Users/chris/.gem/ruby/2.7.6/gems/bundler-2.3.26/lib/bundler/vendor/thor/lib/thor.rb:392:in `dispatch'
4:29:41 PM web.1 |      from /Users/chris/.gem/ruby/2.7.6/gems/bundler-2.3.26/lib/bundler/cli.rb:31:in `dispatch'
4:29:41 PM web.1 |      from /Users/chris/.gem/ruby/2.7.6/gems/bundler-2.3.26/lib/bundler/vendor/thor/lib/thor/base.rb:485:in `start'
4:29:41 PM web.1 |      from /Users/chris/.gem/ruby/2.7.6/gems/bundler-2.3.26/lib/bundler/cli.rb:25:in `start'
4:29:41 PM web.1 |      from /Users/chris/.gem/ruby/2.7.6/gems/bundler-2.3.26/exe/bundle:48:in `block in <top (required)>'
4:29:41 PM web.1 |      from /Users/chris/.gem/ruby/2.7.6/gems/bundler-2.3.26/lib/bundler/friendly_errors.rb:120:in `with_friendly_errors'
4:29:41 PM web.1 |      from /Users/chris/.gem/ruby/2.7.6/gems/bundler-2.3.26/exe/bundle:36:in `<top (required)>'
4:29:41 PM web.1 |      from /Users/chris/.gem/ruby/2.7.6/bin/bundle:25:in `load'
4:29:41 PM web.1 |      from /Users/chris/.gem/ruby/2.7.6/bin/bundle:25:in `<main>'
[DONE] Killing all processes with signal  SIGINT
4:29:41 PM web.1 Exited with exit code null

Gemfile.lock を削除しようとしましたが、バンドルインストールを再度実行しても機能しませんでした。また、コマンドbundle exec heroku localを使用してみましたが、依然として同じエラーメッセージが表示されます。

解決策

アプリケーションを Apple Silicon 上でローカルに実行し、本番環境では Heroku 上で実行する場合、それはアプリケーションを異なるプラットフォーム上で実行することを意味します。そして、両方のプラットフォームに必要な gem を処理できる必要があることを Bundler に認識させる必要があります。

Bundler の汎用 Ruby プラットフォームはほとんどの場合に機能しますが、プラットフォーム固有のバージョンでの作業が必要または推奨される特殊なケースもあります。たとえば、正しいプラットフォームを使用していない場合、Apple Silicon 上で libv8-node gem をインストールするのは非常に遅くなります。別の例は、使用している puma gem が動作するために正しいプラットフォーム構成を明示的に必要としているようです。

したがって、現在使用しているすべてのプラットフォームを Gemfile に追加することをお勧めします。これにより、すべてのプラットフォームで利用できない gem を追加することがなくなります。また、プラットフォームに最適化されたバージョンを使用できるため、特に C バインディングを使用した gem のコンパイル時間が短縮されるはずです。

次のように、(エラー メッセージに従って) 使用しているすべてのプラットフォームを Gemfile に追加することをお勧めします。

bundle lock --add-platform ruby x86_64 arm64

次に、bundle install を再度実行します。

バンドル プラットフォームとバンドル ロックについては、Bundler のドキュメントを参照してください。