私はこれで2週間近く頭を悩ませてきました。rbenvがインストールされたUbuntu 14.04サーバーを使用して、いくつかの異なるRails Webサイトを実行しています。それらの一部は古いバージョンのRailsにあり、一部は最新バージョンにあります。
特に2つのWebサイトがあり、どちらも異なるバージョンのpuma_worker_killerが必要です。1つは0.1.0が必要で、もう1つは0.1.1が必要です。これらのWebサイトは両方ともRuby 2.5.3を使用しています。
サーバーを起動するとRAILS_ENV=dev3 bundle exec pumactl -F ./config/puma.rb start
、ログに次のエラーが表示され、Webサイトがハングします。
You have already activated puma_worker_killer 0.1.1, but your Gemfile requires puma_worker_killer 0.1.0. Prepending `bundle exec` to your command may solve this. (Gem::LoadError)
最初に〜/ .rbenvではなく〜/ .gemにgemをインストールしていたため、rbenvに問題があるのではないかと思ったので、すべてのルビーを〜/ .gemに入れて、正しい場所に新しくインストールしましたrbenvフォルダーを使用bundle install
しても、同じ問題が引き続き発生します。
この時点で、私はこの問題についてオンラインで広範な調査を行ったことを明確にしたいと思います。これを解決するために私は多くのことができることを知っています。
バージョンとを変更するだけで十分bundle update puma_worker_killer
です。
また、gem uninstall puma_worker_killer
0.1.1を実行して選択することで最新バージョンを削除できることも知っていますが、これは他のWebサイトへの依存関係が満たされないことを意味します。
バンドラーのソースコードを掘り下げて調べたところ、次のコード行が原因であることがわかります。
return if activated_spec.version == spec.version
とmatchのbundle exec
両方を使用してバンドラーのコンテキストで実行する場合、そのメソッド()の次のコードは実行されません。何らかの理由で、上記のコマンドを実行してサーバーを起動すると、(アクティブ化されたgem)は最新バージョン(0.1.1)であり、Gemfile(0.1.0)にリストされているものではないため、返されずにスローされます上記のエラー。activated_spec
spec
check_for_activated_spec!
activated_spec
また、puma_worker_killerの依存関係の1つであるget_process_memにも同じ問題があるようです。それはすでに0.2.5をアクティブ化していると不平を言っていますが、私のGemfileは0.2.4を望んでいます:
You have already activated get_process_mem 0.2.5, but your Gemfile requires get_process_mem 0.2.4. Prepending `bundle exec` to your command may solve this. (Gem::LoadError)
bundle exec
同じgemに複数のバージョンがあるというこの非常に問題を解決するために使用する場合は、gemfileにリストされているバージョンをロードする必要があるというのが、bundleの私の理解です。
プロジェクト内に異なるバージョンのpuma_worker_killerが含まれる別のgemset(明らかにrbenvを使用して実行できます)を作成し、実行するrbenv local 2.5.3-pwk0.1.0
か、または目的のバージョンにrbenv local 2.5.3-pwk0.1.1
応じて、プロジェクト内で実行することもできますが、それはやりたいことにはやり過ぎのようです成し遂げる。
このレートでは、puma_worker_killerとget_process_memの両方の最新バージョンですべてのWebサイトを更新し、それらをロックしてサーバー上のすべての古いバージョンを削除したくなりますが、そうする必要はないと思います。
ここで何が起こっているのか、または私が目立って間違っていることをしているのか誰か知っていますか?
以下は、私のpuma構成でpuma_worker_killerを使用するために使用するコードです。
before_fork do
require 'puma_worker_killer'
PumaWorkerKiller.config do |config|
config.ram = 1024 # mb
config.frequency = 5 # seconds
config.percent_usage = 0.98
config.rolling_restart_frequency = 12 * 3600 # 12 hours in seconds
end
PumaWorkerKiller.start
end
bundle update puma_worker_killer
、サーバーにインストールされている最新バージョンのpuma_worker_killerを使用するだけなので、それは実行に似ているだけではありません